指针容易弄错的概念

一、指针加减指针

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的值

 

 

 

 

 

 

 

posted @ 2021-08-06 18:35  疯狗强尼  阅读(59)  评论(0编辑  收藏  举报