Re: [問題] C語言關於陣列位置的問題

作者: RealJack   2014-05-21 00:09:48
※ 引述《takeabreak2 (小林)》之銘言:
: 大家好
: 小弟這兩天才注意到一個問題
: 困擾了很久一直想不通
: int a[5]={0,1,2,3,4};
: printf("%X", a); //印出a的內容:3B241EA0
: printf("\n");
: printf("%X", &a); //印出a的位置:3B241EA0
: printf("\n");
: printf("%d", *a); //印出a所指的位置的內容:0
: 註解是我對程式碼的理解
: 如果a的位置和內容相同
: 那a不是指向自己了? *a怎麼會是0?
: 大學用C語言寫了四年
: 第一次注意到這件事......
我覺得還是要補充一下
array name代表array第一個元素的位置
是compiler自行產生的值,而且是一個不可修改的"左值"
不是右值喔,因為&運算子不可作用於右值,但可以作用於array name
另外要考慮型別
以下語句在C會過但有warning,而在C++會fail
int arr[3];
int (*pa1)[3]=arr; //要改成int (*pa1)[3]=&arr
因為arr是"第一個元素"的位置,第一個元素的型別是int*
故arr的型別也是int*
而&arr的型別是int(*)[3]
&作用於array name時,要考慮array的"整個"型別,而非第一個元素的型別
因為此時arr沒被轉成pointer,如果arr再被轉成pointer,那&arr就變成指標的指標(X)
C不會像C++對型別那麼嚴格,所以只產生warning
也就是說&arr只有值等於arr,型別並沒有
再來考慮多維陣列,C/C++沒有多維陣列,只有陣列的陣列
int brr[2][3];
int (*pb1)[2][3]=&brr; //指向整個array的指標
int (*pb2)[3] =brr; //指向第一個元素的指標
pb2指向brr的第一個元素,此元素也是陣列=>{1,2,3}
希望對你有幫助,如果有錯也請多指教

Links booklink

Contact Us: admin [ a t ] ucptt.com