如何解决为什么在下面的代码中两个不同的变量具有相同的地址但具有不同的值?
检查 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,也不能将未初始化的值用作指针。 (它没有指向任何东西。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。