我们知道当定义一个变量后,系统会为这个变量分配内存空间,那么变量名就是这个空间的名字,这个空间可以保存值,这个空间有地址。
如:int num = 5;
这是一个整型变量,系统为这个变量分配了内存空间,num就是就是这个内存空间的名字,5就是保存在这个空间里的值,这个空间有地址。
num++:就是num对应的空间里的值加1,即5+1。
int *p = #
这是定义了一个指针变量,并初始化了,系统为这个指针变量分配了内存空间,p就是这个内存空间的名字,num的地址就是保存在这个空间里的值,这个空间本身也有地址。
p++: 就是p对应的内存空间里的值加1,即num的地址。
(*p)++: 就是p指向的内存空间里的值加1,即num的值。
int ** pp =&p;
这是定义了一个二维指针变量,系统为这个变量分配了内存空间,pp就是这个内存空间的名字,指针p的地址就是保存在这个空间里的值,这个空间本身也有地址。
pp++: 就是pp对应的内存空间的值加1,即p的地址。
(*pp)++: 就是pp指向的内存空间的值加1,即num的地址。
(**pp)++: 就是pp指向的指针指向的内存空间的值加1,即num的值。
注:指针加1是加一个步长,不同的指针有不同的步长,由指针的类型决定。
像三维指针甚至更高维度的指针都是这样一层一层嵌套的。
对于数组我们需要弄清楚对数组名取地址与对数组地址取值之间关系。
首先对于一维数组,一维数组名是一个指针常量,它保存的是数组首元素的地址。
对一维数组名取地址等于一维数组的地址。
对一维数组的地址取值等于一维数组首元素的地址。
注:对数组的地址加一就是加一个数组的长度。数组首元素地址加一就是指向下一个元素的地址。
二维数组:
二维数组名是一个指针常量,它保存的是首个一维数组的地址。
对二维数组名取地址等于二维数组的地址。
对二维数组的地址取值等于二维数组中首个一维数组的地址。
例:*(*(a+i)+j)
a+i: 第i+1个一维数组的地址。
*(a+i): 第i+1 个一维数组的首元素的地址。
*(a+i)+j : 第i+1个一维数组的第j+1个元素的地址。
*(*(a+i)+j): 第i+1个一维数组的第j+1个元素的值。