一、先来看定义式:
int a = 300;
int b* = &a;
这时候b的内存里面存的是a的地址,a的内存地址里面存300。比如这时候设置一个int* c =b;一个指针作为右值,是把它的值交出去,所以c得到了a的地址,如果是作为左值,就是获得右值放入自己的地址内容里。这非常重要!!
当然*b就是间接访问,由于b的值是一个地址,然后就可以对这个地址取值,就取了a的值。
二、未初始化和非法的指针
int *a;
*a = 12;
这时候我们都不知道a所指的位置,直接对这个未知的位置进行赋值,改变那个内存单元,没办法知道改变了哪里。如果运气好,a的初始值是非法地址,报错,终止程序,如果是合法地址,无意修改,错误就无法预知,可能更改了重要的数据。
对所有的指针最好要进行显式的初始化。
三、比较重要的指针操作:*与++运算符的结合
*非常简单,是取这个地址里面的值。
*cp+1就是取了cp里的值作为地址,然后获得这个地址里面的值,取出再与1相加:
如图:
cp+1就是a后面的一个地址了,根据cp所指向值的类型,再去考虑这个+1是加几个字节。对其取*也是未知的。
++操作符是获得指针的一份拷贝,如果是++cp就是先把cp加完以后,获得一份拷贝。cp++就是先获得拷贝再加加。
如图:
所以*++cp就是指向cp后的那个单元获得一个拷贝再取其值。++*cp就是把a先获得,然后加为b,再获得这个值的拷贝(这个拷贝主要是为了赋值给别的变量)
再来考虑++*cp++,先考虑操作符的结合性和优先级,是从右向左的,所以先取出对cp进行一个拷贝,然后取*,然后cp指向下一个地址,再++之前拷贝了地址里面的值。
如图所示