马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
int main()
{
int array[3]={0,1,2};
int* p=array;
int* pp=&array;
printf("p+1=%d, pp+1=%d\n",*(p+1),*(pp+1));
return 0;
}
为什么p+1的值与pp+1的值是一样的,都是第二个元素的值?,两者指向的含义是不同的呀。
问题分析:
在C/C++中,数组名是数组首元素的地址。将数组名赋值给指针变量,可以得到指向数组首元素的指针。在给定一个指针变量时,对该指针进行加法运算时,实际上是对指针的值进行偏移。
在给定代码中, int* p = array; 和 int* pp = &array; 分别将数组 array 的首地址赋值给指针变量 p 和 pp。然后通过 p 和 pp 进行加法运算,输出结果。
解答:
在给定的代码中, p+1 和 pp+1 实际上是对指针进行加法运算,即将指针的值偏移了相应的字节大小。
虽然 p 和 pp 都指向了数组 array 的首地址,但它们的类型是不同的。 p 是 int* 类型的指针,而 pp 是 int (*)[3] 类型的指针,它表示一个指向具有3个整型元素的数组的指针。
由于 p 和 pp 的类型不同,导致它们在进行加法运算时的行为也不同。
- 对于 p+1, p 是 int* 类型的指针,所以 p+1 表示指针 p 往后偏移了一个 sizeof(int) 的字节大小。因此,输出结果输出的是数组 array 的第二个元素的值。
- 对于 pp+1, pp 是 int (*)[3] 类型的指针,所以 pp+1 表示指针 pp 往后偏移了一个整个数组 array 的大小。因为 array 是一个 int[3] 数组,所以 pp+1 实际上跳过了整个数组 array 的长度。因此,输出结果仍然是数组 array 的第二个元素的值。
所以,尽管 p 和 pp 的类型不同,但由于在加法运算中都实现了偏移操作,因此 p+1 和 pp+1 都指向了数组 array 的第二个元素,并且输出结果相同。
总结:
- p+1 和 pp+1 都进行了指针的偏移运算,但由于 p 和 pp 的类型不同,导致了实际的偏移量不同。
- p+1 偏移了一个 sizeof(int) 的字节大小,而 pp+1 偏移了整个数组 array 的大小。
希望这个回答对你有所帮助。如果还有其他问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!  
|