以下是2个程序
第一
#include<stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int *p;
p=&a;
printf("%u %u",p,p+1);
}
第二
#include<stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
printf("%u %u",&a,&a+1);
}
现在,在两个程序中..我已经在第一个代码中使用p打印了&amp; a的值,并且直接在第二个代码中打印...
为什么结果不同?
我得到的答案是。
for first 3219048884 3219048888
for second 3219048884 3219048904
答案 0 :(得分:14)
&a
的类型为int (*) [5]
。因此,&a+1
是一个比int
更进一步的a
指针。但是p
的类型为int *
,因此p+1
是一个比int
更远的p
指针。
答案 1 :(得分:7)
当我跑步时,我明白了:
1245036 1245040 1245036 1245040
1245036 1245040 1245036 1245056
唯一区别在于最后一个位置p+1
与&a+1
p
是指向整数的指针,因此p+1
是下一个整数的地址。 (即在记忆中进一步增加4个字节)
a
是一个包含5个整数的数组,因此&amp; a + 1是下一个5个整数数组的地址。 (即,在记忆中进一步增加20个字节)
答案 2 :(得分:2)
在两个程序中,您都在打印阵列的内存地址。
每次运行程序时都会有所不同。操作系统选择给你的内存可能不同。
当你的程序声明一个包含5个整数的数组时,操作系统会承诺给你5个连续的整数,它不会保证你会得到什么样的内存,或者你每次都会获得相同的内存。
答案 3 :(得分:2)
你有两个具有不同堆栈帧的程序,毫不奇怪,局部变量的地址是不同的。每次运行程序时,Il都可能会更改(这就是我在尝试时所做的事情,在Linux上使用gcc编译的代码)。
但是除了系列的最后一个值之外,你将得到与1以下程序相同的值(除了最后一个值,因为指针算法的工作方式)。
#include<stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int *p;
p=&a;
printf("%u %u %u %u ",a,a+1,p,p+1);
printf("%u %u %u %u",a,a+1,&a,&a+1);
}
对于指针与数组之间差异的(完全)完整解释,您可以查看我的答案here
答案 4 :(得分:1)
您的第一个程序无效。分配p = &a
是非法的,因为p
的类型为int *
而&a
的类型为int (*)[5]
。这些类型不兼容。如果你的编译器足够宽松以允许这种赋值(它至少警告过你吗?),它可能会将其解释为p = (int *) &a
,即它强行将&a
的值重新解释为{{1}指针。因此,第一个程序中的所有指针算术都是int *
算术。这就是第一个程序为int *
和a+1
值生成相同输出的原因。
在第二个程序中,p+1
的值不会被重新解释。它保持原始类型``int()[5] &a
int()[5] and it follows the rules of normal pointer arithmetic for type
&amp; a + 1 , meaning that when you do
sizeof(int [ 5])`字节,应该如此。这就是为什么结果与第一个程序不同的原因。
答案 5 :(得分:-2)
您应该使用p = a
而不是p = &a
。像a
这样的数组已被假定为常量指针。您无需使用&
运算符取消引用它。