问题描述
检查 a
和 p[1]
的值和地址:
#include<stdio.h>
main()
{
int a=10,*p,c=20,n,i;
printf("---&a is %p\n",&a);
printf("---&p is %p\n",&p);
printf("---&c is %p\n",&c);
printf("---a is %d\n",a);
printf("---p is %d\n",p);
printf("---c is %d\n",c);
printf("Enter size: ");
scanf("%d",&n);
printf("Enter ele: ");
for(i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
printf("---&p[1] is &p\n",&p[1]);
printf("---&p+1 is &p\n",&p+1);
printf("---a is &d\n",a);
printf("---p[1] is &d\n",&p[1]);
printf("---p+1 is &p\n",&p+1);
printf("---a is &p\n",a);
printf("---&a is &p\n",&a);
printf("---c4 is &p\n",c);
printf("---&c is &p\n",&c);
}
这里a
和p[1]
的值虽然地址一样,但是不同,为什么?
解决方法
p[1]
是(根据定义)*(p + 1)
。 p + 1
不与 &p + 1
相同,因为 &p
是变量 p
的地址,而 p
是变量的内容该地址的内存。
您的代码也存在许多问题。
事实证明,&p + 1
是合法且定义良好的,尽管您不能取消对它的引用(也就是说,您不能使用 *(&p +1)
。)地址是有效的,因为指针算术允许您处理非-array 变量就好像它们是长度为 1 的数组一样,对于任何数组,您都可以计算超出数组末尾一个元素的地址。不允许取消引用最后一个地址,但可以将该地址与指向实际数组元素的指针进行比较。)
您也无法计算 *(p+1)
,因为 p
尚未初始化,因此您不能对其加 1,也不能将未初始化的值用作指针。 (它没有指向任何东西。)