访问指针数组中的元素

时间:2012-09-12 14:00:51

标签: c arrays pointers

我正在尝试使用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

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

有谁可以解释这里发生的事情?

2 个答案:

答案 0 :(得分:5)

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

一旦取消引用其中任何一项,就会出现未定义的行为。

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

答案 1 :(得分:4)

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

*(a + i)相当于a[i];您正在检索i的{​​{1}}'元素,因此a将与*(a + 2)相同,a[2] 3 }。

*a + i相当于a[0] + i;由于a[0]的类型为int *,因此a[0] + i的结果是{i 之后{em> int指针的值{ {1}}。如果a[0]为4且sizeof (int *)等于a[0],则1将为*a + 15将为*a + 2等。

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

%p

如果要索引数组,请使用下标表示法(printf("*a + 2 = %p\n", *a + 2); )。使用指针表示法令人困惑且容易出错(正如您所发现的那样)。

相关问题