3

我正在尝试使用 gcc 编译器执行以下 C 程序。

#include <stdio.h>

int main()
{   
    int *a[] = {1,2,3,4,5,6};

    printf("\narr0=%d\n", *a);
    printf("arr1=%d\n", *(a+1));
    printf("arr2=%d\n", *a+2);
    printf("arr3=%d\n", *a+3);
    printf("arr4=%d\n", *a+4);

    return 0;
}

Output:-
arr0=1
arr1=2
arr2=9
arr3=13
arr4=17

当我跳过 *a+2、*a+3、*a+4 的括号时,我无法理解发生了什么。对于 *a+2 它操作为:

= *a+2
= *a+(4*2)           4 ->Size of int
= 1+(8)
So, *a+2 = 9

对其他人也是如此。

但我期待输出如下。(?)

arr0=1
arr1=2
arr2=3
arr3=4
arr4=5

我知道,我声明指针数组的方式不好。

谁能解释这里发生了什么?

4

2 回答 2

5

您正在声明一堆指向无效地址的指针,因为小整数通常不是有效的整数指针。顺便说一句,您应该收到编译器警告;在此处发布问题之前阅读并修复它们是个好主意。或者至少提到你确实收到了警告。

一旦您取消引用其中任何一个,未定义的行为就会发生。

最好你永远不要这样做,你所做的只是索引到数组本身,并使用错误的格式说明符打印指针(你应该使用%p,而不是%d)。

于 2012-09-12T14:02:40.523 回答
4

一元*的优先级高于二元+,因此*(a + i)*a + i的解释不同。

*(a + i)相当于a[i]; 您正在检索 的i'th元素a因此*(a + 2)将与a[2]which相同3

*a + i相当于a[0] + i; 因为a[0]是 type int *,结果是'th 指向after的指针a[0] + i的值。如果is 4 并且equals ,则will be ,will be等。 iinta[0]sizeof (int *)a[0]1*a + 15*a + 29

使用%p转换说明符打印指针值:

printf("*a + 2 = %p\n", *a + 2);

如果要对数组进行索引,请使用下标表示法 ( a[i])。使用指针表示法令人困惑且容易出错(正如您所发现的)。

于 2012-09-12T15:01:34.157 回答