指针
指针就是保持地址的变量
作为参数的指针
·void f(int *p);
·在被调用的时候得到了某个变量的地址;
·int i=0; f(&i);
·在函数里面可以通过这个指针访问外面的这个i
访问那个地址上的变量*
·*是一个单目运算符,用来访问指针的值所表示的地址上的变量
·可以做右值也可以做左值
·int k=*p;
·*p=k+1;
*左值之所以叫左值
·是因为出现在赋值号左边的不是变量,而是值,是表达式计算的结果;
·a[0]=2;
·*p=3;
·是特殊的值,所以叫做左值
指针的运算符&*
·互相反作用
·*&yptr ➡ *(&yptr) ➡ *(yptr的地址) ➡ 得到那个地址上的变量 ➡ yptr
·&*yptr ➡ &(*yptr) ➡ &(y) ➡ 得到y的地址,也就是typr ➡ yptr
指针应用场景二b
·函数返回运算的状态,结果通过指针返回
·常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错
·-1或0(在文件操作会看到大量的例子)
·但是当任何数值都是有效的可能结果时,就得分开返回了
数组变量是特殊的指针
·数组变量本身表达地址,所以
·int a[10];int*p=a; //无需用&取地址
·但是数组的单元表达的是变量,需要用&取地址
·a==&a[0]
·【】运算符可以对数组做,也可以对指针做:
·p[0]<==>a[0]
·*运算符可以对指针做,也可以对数组做:
·*a=25;
指针是const
·表示一旦得到了某个变量的地址,不能再指向其他变量
·int*const q=&i;//q是const
·*q=26;//OK
·q++; //ERROR
所指是const
·表示不能通过这个指针去修改那个变量(并不能使那个变量成为const)
·const int*p=&i;
·*p=26;//ERROR!(*p)是const
·i=26;//OK
·p=&j;//OK