2013-07-05 86 views
2

我得到warning: assignment from incompatible pointer type [enabled by default]當我編譯下面的代碼:指向數組的指針給兼容的指針類型的警告

int main() { 
    int (*aptr) [5] = NULL; 
    int arr[5] = {1,2,3,4,5}; 

    aptr = &arr[0]; 

    printf("aptr = %p\n arr = %p\n", aptr, &arr[0]); 
    return 0; 
} 

我得到正確的輸出:

aptr = 0xbfcc2c64 
arr = 0xbfcc2c64 

但是我爲什麼得到不兼容指針類型的警告?

+1

[爲什麼指向數組的指針需要在作爲參數傳遞給具有數組類型參數的函數之前進行轉換?](http://stackoverflow.com/questions/17438175/why-does-a-指針到數組 - 需要被投 - 之前 - 被傳遞 - 作爲參數 - ) –

回答

8

您聲明瞭一個指向整個數組的指針。你爲什麼試圖讓它指向第一個元素

如果你想聲明的aptrint (*)[5]類型,在你的榜樣,並使其指向arr,那麼這就是你應該如何設置指針值

aptr = &arr; 

你有什麼您的代碼現在是嘗試將int *值分配給int (*)[5]類型的指針。這些是不同的類型,這就是爲什麼你會得到警告(實際上這是違反約束,AKA錯誤)。

+0

感謝您的回覆,警告已被刪除。只需稍作澄清,&arr就是數組的地址。 &arr [0]是數組中第一個元素的地址,在概念上它們都保持相同的地址..不是嗎?我試圖打印出打印出來的值&arr和&arr [0],&arr = 0xbfa092e4 &arr [0] = 0xbfa092e4 請原諒是否愚蠢的問題。 – user2552690

+1

@ user2552690:是的,純數字地,整個數組的地址總是與其第一個元素的地址相同。然而指針的類型是不同的。作爲其中一個結果,例如,對於這樣的指針,指針運算的工作方式不同。嘗試打印'&arr + 1'和'&arr [0] + 1',你會看到區別。 – AnT

+0

得到澄清!謝謝你! – user2552690

0

數組名稱本身給出的基址不需要使用& arr.Moreover arr [0]表示第一個索引處的值。

相關問題