学习链接:
http://www.icourse163.org/learn/ZJU-200001?tid=1002316004#/learn/content?type=detail&id=1003086473&cid=1003636045
指针的应用场景
1.交换两个变量
2.函数返回多个值,某些值就只能通过指针返回
传入的参数实际上是需要保存带回的结果的变量
3.函数返回运算的状态,结果通过指针返回
传入函数的数组成了什么?
函数参数表中的数组实际上是指针
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]
[]运算符可以对数组做也可以对指针做:
p[0]<==>a[0]
*运算符可以对指针做,也可以对数组做
*a=25
数组变量是const的指针,所以不能被赋值
int a[] -->int * const a
指针与const
指针是const 表示一旦得到某个变量的地址,不能在指向其他的变量
int * const q = &i ;
* q =;26;
q++;
表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)
const int * p= &i;
*p = 26;error
i = 26;ok
p=&j ;ok
转换
1.总是可以把一个非const的值转换成const的
2.当要传递的参数的类型币地址的时候,这是常用的手段:既能用比较少的字节数传递给参数,又能避免函数对外面的变量的修改
const数组
const int a[]={1,2,3}
数组变量已经是const的指针了,这里的const表明数组的每个单元都是const int
所以必须通过初始化进行赋值
保护数组值
因为把数组传入函数时传递的是地址,所以函数内部可以修改数组的值
为了保护数组不被函数破坏,可以设置参数为const
int sum (const int a[], int length);