指针容易弄错的概念
一、指针加减指针
int arr[10]={0,1,2,3,4,5,6,7,8,9};
printf("%d",&arr[9]-&arr[0]);
结果等于9,说明指针进行减法运算实际得到两个地址之间元素的个数
二、数组名代表数组的首地址,那么&数组名代表什么?
准备知识:通常我们说数组名是数组首元素地址,尽管数组第一个元素的地址和整个数组的地址值相同,但含义不同,(&+数组名)代表的地址其实是整个数组的首地址
上述两种情况下数组名代表的是整个数组的地址,其他所有情况,数组名都代表数组首元素地址。
那么什么是整个数组的地址呢?先上图
从上图可知,arr和&arr[0]都代表数组首元素的地址,它们加一,代表数组元素移动一个位置,而一个整形4个字节,所以地址跳转4个字节,而&arr代表整个数组的地址,它加一代表指针跳过整个数组空间,指向数组末尾
三、二级指针
int a=10;
int* pa=&a;
int** ppa=&pa;
我们可以这样理解指针定义,如int* pa,可以这么理解,pa是一个指针类型,它指向一个int类型对象,而二级指针ppa可以理解为它是一个指针类型,它指向一个类型为int*类型的对象,所以定义时,在数据类型和星号之间可以用空格分开表示,这样更清晰,如:
int a=10;
int * pa=&a;
int* * ppa=&pa;
再说一下解引用二级指针的概念,*ppa表示pa里面存储的内容,要通过ppa获得一级指针pa指向的单元存储的内容,就要对ppa进行两次解引用,如:**ppa,也就是获得a的值