關於C語言中對數組取址的問題,詳見補充: 如下: 定義一個數組INT8U a[4];然後對它進行強制轉換(暫時不用考慮大小端的問題啊),有三種寫法: 1,*(INT32U *)a; 2,*(INT32U *)(&a[0]); 3,*(INT32U *)(&a); 請問第3種寫法是否正確?我認為是錯誤的,但是為什麼編譯和實際運行都沒有問題?如果是正確的,該如何理解? 解答: (a) 是一維數組首地址, (&a[0]) 還是一唯數組首地址 與(a)等價 (&a) 二唯數組首地址,其一唯的寬度就是數組a的元素個數首地址值是相同的,而你都做了強制轉換,所以看不出差別 如果用以下方法,就可以看出差別了 printf("%x ", (void *)(a+1) ); //==&a[1] printf("%x ", (void *)(&a[0]+1) ); //==&a[1] printf("%x ", (void *)(&a+1) ); //==&a[sizeof(a)+1] 追問,我定義的是一維數組,如何理解(&a)變成二唯數組首地址了呢?是編譯器的默認處理嗎? 回答 a本來就只是一個數組的首地址,不是指針變量,但相當於一唯指針,對它取地址,系統會讓為是把這個數組整體當一個元素而得到的指針,這指針首地址沒變,而做+1等地址運算時,是直接以整個數組為元素向後移指針的,這種行為就說明它是比這個a多一唯層了應當是編譯器處理的規則,,更且體的歸納如下:int i; i只是一個0唯的(只有一個元素)int *p=&i; 此時p可以算是比i多一唯層,也就是可以當作一唯數組,指向0唯元素int **p2 = &p; 看得出p是或相當於一唯數,而&p卻是又多一唯層,屬於二唯,指向1唯元素int ***p3 =&p2; 很明顯,對二唯指針取地址得到的是三唯的指針....指向二唯元素......數組名和指針的區別在於,數組名是const型指針,不能對指針本身賦值,不能改變指針本身除此之外兩者有區別嗎,沒有,所以,對於 int a[4]; a是一唯的指針(常量), &a當然是成了二唯的指針類型了