为什么不同答案?

时间:2010-09-03 19:39:00

标签: c arrays pointers

以下是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

6 个答案:

答案 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这样的数组已被假定为常量指针。您无需使用&运算符取消引用它。