2012-09-12 107 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