指针指向的数据类型是什么,“指针+1”就跳过一个相应类型的数据,让指针指向跳过这个数据后的地址。
定义一个整型指针int* p;,因为整型指针指向整型数据,所以“p+1”则代表跳过一个整型数据,“p+1”的值就为跳过这个整型数据后的地址。因为一个整型数据占4个字节,需要4个内存单元储存,所以指针的地址值+4。
下图为验证的代码与运行结果:
因为指针常常存储在指针变量中,所以多见上面“p+1”这种“指针变量+1”的操作,但本质还是“指针+1”,只是利用指针变量间接操作指针。
但是也有对指针直接操作的,那便是数组名,这里涉及一个重要内容。下面我们以数组int arr[5] = {1, 2, 3, 4, 5};进行重点说明。
在此之前补充一个知识:sizeof(数组名)和&数组名,这里的数组名表示整个数组。除此之外,任何地方使用数组名,数组名都作为首元素的指针被使用,表示首元素的地址。
当我们对arr+1时,因为数组名arr是指向数组首元素‘1’的指针,所以(arr+1)代表着跳过一个整型数据‘1’,指针arr会指向跳过这个数据后的地址,对它解引用有*(arr+1)=2。
但是(&arr+1)又大不相同,&arr代表着取出整个数组的地址,说明&arr是指向一整个数组的指针,则意味着(&arr+1)会跳过一整个数组,指针&arr会指向跳过这个数组后的地址。
所以说我们使用指针不能只关注它的地址,更要关注它所指向的数据类型。arr与&arr的地址值相同,但是指向的数据类型完全不同,所以“指针+1”的结果也完全不同。
下图为验证的代码与运行结果:
同理可得,“指针+2”就跳过两个相应类型的数据,让指针指向跳过两个数据后的地址;“指针-1”就是回跳一个相应类型的数据,让指针指向回跳一个数据后的地址。
下图为验证的代码与运行结果: