2012-09-12 83 views
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 

我知道,我已经声明了指针数组的方式不是很好。

任何人都可以解释这里发生了什么?

+0

注意编译器警告。如果你的编译器没有给出有关不是指针的数组初始化函数的警告,或者打开警告,或者让自己更好的编译器(并打开它提供的警告)。 –

回答

5

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

只要解除引用其中任何一项,就会发生未定义的行为。如果你不这样做,你只需要索引到数组本身,然后使用错误的格式说明符(应该使用%p而不是%d)来打印指针。

+0

虽然它显示未定义的行为,但输出中有一些图案,如果我继续打印,则此模式会继续。这个模式显示为简短的int,char也是。 – RajendraW

4

一元*具有比二元+更高的优先级,所以*(a + i)*a + i的解释不同。

*(a + i)相当于a[i];您正在检索i的第元素a,因此*(a + 2)将与a[2]相同,这将是3

*a + i相当于a[0] + i;因为a[0]int *的类型,因此a[0] + i的结果是在a[0]之后指向的第012th指示符的值。如果sizeof (int *)是4和a[0]等于1,然后*a + 15*a + 29

使用%p转换说明打印指针值:如果你想索引到

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

数组,使用下标符号(a[i])。使用指针表示法会造成混淆并容易出错(正如您发现的那样)。

+0

当我这样做聊天时,短int,加倍显示我相同的模式。对于int *,它增加了4,对于char * - 它增加了4,简称int * - 它增加了double *,它增加了7. sizeof(int *),sizeof(char *),sizeof(short int *), sizeof(double *)是4.如果它增加了指针的大小,那么它应该为每个数据类型添加4。但是这没有发生。 – RajendraW