开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
访问那个地址上的变量*
*是一个单目运算符,用来访问指针的值所表示的地址上的变量;
可以做右值也可以做左值;
int k=*p; *p=k;
为什么在左边叫左值
是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果;
a[0]=2;
*p=3;
是特殊的值,所以叫左值。
指针的运算符&、*
互相反作用
*&a->a;
&*a->a。
指针应用场景一
交换两个变量的值
void swap(int *pa,int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}
指针的用处为如果函数里用单纯的int整形,则只能在swap中起作用,出来swap就无作用了。
指针应用场景二
函数返回多个值,某些值只可以通过指针返回,传入的参数实际上是需要保存带回结果的变量。
函数返回运算的状态,结果通过指针返回:常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错(-1或0)。
若任何数值都是有效的可能结果时,要分开返回。
return来返回状态,值用指针参数。
指针最常见的错误
定义了指针变量,还没有指向任何变量,就开始使用指针。
传入副函数的数组成了什么
函数参数表中的数组实际上为指针
sizeof(a)==sizeof(int *)
但是可用数组运算符[]进行计算。
在函数数组中,以下四种函数原型是等价的
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int[],int);
数组变量是特殊的指针
数组变量本身表达地址(int a[10];int *p=a; // 无需&)
但是数组的单元表达的是变量,需要用&取地址(a==&a[0])
[]运算符可以对数组做,也可以对指针做。