c++ 指针(三)
指针
(6)传递指针给函数
只需要简单地声明函数参数为指针类型即可
- #include <iostream>
- #include <ctime>
- using namespace std;
- void getSeconds(unsigned long *par);
- int main ()
- {
- unsigned long sec;
- getSeconds( &sec );
- // 输出实际值
- cout << "Number of seconds :" << sec << endl;
- return ;
- }
- void getSeconds(unsigned long *par)
- {
- // 获取当前的秒数
- *par = time( NULL );
- return;
- }
结果:Number of seconds :1294450468
能接受指针作为参数的函数,也能接受数组作为参数
- #include <iostream>
- using namespace std;
- // 函数声明
- double getAverage(int *arr, int size);
- int main ()
- {
- // 带有 5 个元素的整型数组
- int balance[] = {, , , , };
- double avg;
- // 传递一个指向数组的指针作为参数
- avg = getAverage( balance, ) ;
- // 输出返回值
- cout << "Average value is: " << avg << endl;
- return ;
- }
- double getAverage(int *arr, int size)
- {
- int i, sum = ;
- double avg;
- for (i = ; i < size; ++i)
- {
- sum += arr[i];
- }
- avg = double(sum) / size;
- return avg;
- }
结果:Average value is: 214.4
传递指针给函数的过程补充:
- #include <iostream>
- #include <ctime>
- void getSeconds(unsigned long *par);
- int main()
- {
- unsigned long sec = ;
- cout << "Value of sec = :" << sec << endl;
- cout << "Value of &sec = :" << &sec << endl;
- cout << endl;
- getSeconds(&sec);
- // 输出实际值
- cout << "Number of seconds :" << sec << endl;
- return ;
- }
- void getSeconds(unsigned long *par)
- {
- cout << "Value of *par = :" << *par << endl;
- cout << "Value of par = :" << par << endl;
- cout << "Value of &par = :" << &par << endl;
- cout << endl;
- // 获取当前的秒数
- *par = time(NULL);
- cout << "Value of *par = :" << *par << endl;
- cout << endl;
- return;
- }
(7)从函数返回指针
必须声明一个返回指针的函数
- int * myFunction()
- {
- ....
- }
C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量
下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们:
- #include <iostream>
- #include <ctime>
- #include <cstdlib>
- using namespace std;
- // 要生成和返回随机数的函数
- int * getRandom( )
- {
- static int r[];
- // 设置种子
- srand( (unsigned)time( NULL ) );
- for (int i = ; i < ; ++i)
- {
- r[i] = rand();
- cout << r[i] << endl;
- }
- return r;
- }
- // 要调用上面定义函数的主函数
- int main ()
- {
- // 一个指向整数的指针
- int *p;
- p = getRandom();
- for ( int i = ; i < ; i++ )
- {
- cout << "*(p + " << i << ") : ";
- cout << *(p + i) << endl;
- }
- return ;
- }
结果:
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
- *(p + ) :
补充:
1.指针的本质是变量,可以是各种数据类型,定义一个指针 "*ip",其中 "ip" 需要赋于一个地址(可以用 & 符号获取其他变量的地址再赋值给 ip),而 "*ip" 是一个具体的值,即读取地址后获得的值;
- #include <iostream>
- using namespace std;
- int main()
- {
- int var = ;
- int *ip;
- ip = &var;
- cout << "var的值:";
- cout << var << endl;
- cout << "变量 ip 的储存地址:";
- cout << ip << endl;
- cout << "指针 *ip 的值:";
- cout << *ip << endl;
- return ;
- }
结果:
- var的值:
- 变量 ip 的储存地址:0x7fff5e7deae8
- 指针 *ip 的值:
2.
3.
4.
5. 关于值传递,指针传递,引用传递
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的"别名",对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
- #include<iostream>
- using namespace std;
- //值传递 4 void change1(int n){
- cout<<"值传递--函数操作地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址 6 n++;
- }
- //引用传递10 void change2(int & n){
- cout<<"引用传递--函数操作地址"<<&n<<endl;
- n++;
- }
- //指针传递15 void change3(int *n){
- cout<<"指针传递--函数操作地址 "<<n<<endl;
- *n=*n+;
- }
- int main(){
- int n=;
- cout<<"实参的地址"<<&n<<endl;
- change1(n);
- cout<<"after change1() n="<<n<<endl;
- change2(n);
- cout<<"after change2() n="<<n<<endl;
- change3(&n);
- cout<<"after change3() n="<<n<<endl;
- return true;
- }
6.
7.
8.指针分配与释放一个空间
c++ 指针(三)的更多相关文章
- 从汇编看c++成员函数指针(三)
前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...
- 深入理解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
- 智能指针(三):unique_ptr使用简介
我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...
- [转] 智能指针(三):unique_ptr使用简介
PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...
- C++ 智能指针三
/* 智能指针shared_ptr注意点 */ #include <iostream> #include <string> #include <memory> // ...
- 【校招面试 之 C/C++】第27题 C++ 智能指针(三)之 unique_ptr
auto_ptr<string> p1(new string ("auto") : //#1 auto_ptr<string> p2; //#2 p2 = ...
- C语言 函数指针三(反向调用)
动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...
- 深入学习c++--智能指针(三) unique_ptr
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- 【c++基础】const、const指针、const引用
一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...
随机推荐
- 第二章 Vue快速入门-- 23 品牌案例-根据关键字实现数组的过滤
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Java GUI :Hello World
public class Demo01 extends Frame{ public Demo01(){ super("Demo01");//标题 this.setSize(450, ...
- 【每日一包0008】arr-diff
[github地址:https://github.com/ABCDdouyae...] arr-diff 多个数组比较,过滤出第一个数组独有的内容 用法:arr-diff(arr1, arr2, ar ...
- HDU6739 2019CCPC秦皇岛赛区 I. Invoker
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6739思路:暴力dp 一个special skill最多有6种排列组合 ...
- Iview 在Table组件中添加图片
要先简单了解render函数的使用. 直接上代码: { title: "商品图片", key: "commodityPhoto", align: 'center ...
- idea中使用JRebel插件
首先 等待下载 点击Restart idea (重启idea) 然后等待idea 进行激活 记得勾选下面的那个复选框 激活url:http://139.199.89.239:1008/88414687 ...
- 43 java中的异常处理机制的简单原理和应用
- 插入排序,选择排序,冒泡排序等常用排序算法(java实现)
package org.webdriver.autotest.Study; import java.util.*; public class sort_examp{ public static voi ...
- python web Tornado框架
1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多 ...
- 智能指针之shared_ptr基本概述
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...