指针

(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.

C++ 中常量引用、指向常量的指针、常量指针的区别

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.

C++ 函数指针 & 类成员函数指针

7.

8.指针分配与释放一个空间

最新文章

  1. 由用友NC刷新功能得到启示
  2. SqlHelper c#
  3. Apache Spark技术实战之7 -- CassandraRDD高并发数据读取实现剖析
  4. sql查看数据字典(表结构)
  5. java代码调用oracle存储过程
  6. Lintcode: Expression Evaluation (Basic Calculator III)
  7. Qt版helloworld
  8. hibernate annotation注解 主键ID自增长
  9. sharedevelop iis express
  10. android飞机游戏敌机移动路径
  11. php 5.5 xhprof for windows
  12. 理解Java String和String Pool
  13. 让你成功安装vscode中go的相关插件
  14. 学习EtherCAT的感想
  15. 其他shell
  16. SQL SERVER启动步骤
  17. SonarQube(代码质量管理)环境搭建
  18. ant常用的内置 task转自https://www.cnblogs.com/baicj/archive/2015/12/21/5063608.html
  19. node.js中npm包管理工具
  20. Django:haystack全文检索详细教程

热门文章

  1. python+openCV实现双目视差图及测距
  2. CodeForces - 1175E Minimal Segment Cover (倍增优化dp)
  3. autofs 自动挂载.
  4. Spring Boot干货系列:(十二)Spring Boot使用单元测试(转)
  5. 【Layui】当Layui数据表格和Layui下拉框组合时发生的问题
  6. vue中使用echarts(vue+vue-cli+axios+jsonp+echarts)
  7. centos7安装dockers
  8. docker部署jar工程
  9. hexdump命令
  10. Spring CommonsMultipartResolver 上传文件