注意這段程式碼:
這個沒問題吧。
那換個形式:
這兩個並沒有本質上的區別啊。你把第二組[3]去掉不就是上面那個?
parr是一個指標,指標指向的型別是陣列。他期待一個數組的地址。arr是一個數組,&arr才是陣列的地址。arr的型別是int [3], &arr的型別才是int (*)[3]。而parr的型別是int (*)[3],如果你寫成了parr = arr,那就相當於把int [3]型別賦值給int (*)[3],這個你陌生不要緊,但是你想想你能把int型別賦值給int *型別麼?其實是一個道理。只是陣列型別你比較陌生,所以加上指標你就迷了。
什麼,你問我怎麼判斷變數的型別?很簡單,捂住識別符號,就是它的型別了。
看不懂上面的也沒關係,我們換一種不嚴謹但是好理解的方法來看。
在C語言中,陣列其實是一種特殊的指標,陣列指標一般也只出現在函式傳遞多維陣列的時候。但如果只是在判能否賦值的時候,我們可以偷個雞,簡化成指標看的更清楚。例如此題中,你只是想知道兩者的指標層級關係,那就權且可以把int arr[3]簡化成int * arr,把int (* parr)[3]簡化成int **parr,現在我們再看:
這下總沒問題了吧……arr本質上講是一個int的指標,而對應的parr就成了int的二級指標。把一級指標賦給二級指標,你這是想幹啥?
其實原題下面的解釋也已經很清楚了,只是用&arr[0]的方式讓原本就很繞的邏輯變得更繞了,看著容易蒙圈……其實從變數型別的角度來看,能很快找到答案。賦值,必然是左右兩邊的型別相同(或者可以隱式轉換,例如整形的截斷和提升),指標也不例外。要想把右值賦給左值,那就先要動點腦子把右值變成左值的型別。如果賦值報錯,那一定是右值不能被賦值給左邊,原因無非兩種,要麼左邊不能被賦值,要麼右邊的型別不能被轉化為左邊的。這個問題是在講解陣列指標的應用,到這了,你需要對複雜的混合變數型別有心理準備。陣列指標還只是一個小小的困難點。
祝好。
注意這段程式碼:
這個沒問題吧。
那換個形式:
這兩個並沒有本質上的區別啊。你把第二組[3]去掉不就是上面那個?
parr是一個指標,指標指向的型別是陣列。他期待一個數組的地址。arr是一個數組,&arr才是陣列的地址。arr的型別是int [3], &arr的型別才是int (*)[3]。而parr的型別是int (*)[3],如果你寫成了parr = arr,那就相當於把int [3]型別賦值給int (*)[3],這個你陌生不要緊,但是你想想你能把int型別賦值給int *型別麼?其實是一個道理。只是陣列型別你比較陌生,所以加上指標你就迷了。
什麼,你問我怎麼判斷變數的型別?很簡單,捂住識別符號,就是它的型別了。
看不懂上面的也沒關係,我們換一種不嚴謹但是好理解的方法來看。
在C語言中,陣列其實是一種特殊的指標,陣列指標一般也只出現在函式傳遞多維陣列的時候。但如果只是在判能否賦值的時候,我們可以偷個雞,簡化成指標看的更清楚。例如此題中,你只是想知道兩者的指標層級關係,那就權且可以把int arr[3]簡化成int * arr,把int (* parr)[3]簡化成int **parr,現在我們再看:
這下總沒問題了吧……arr本質上講是一個int的指標,而對應的parr就成了int的二級指標。把一級指標賦給二級指標,你這是想幹啥?
其實原題下面的解釋也已經很清楚了,只是用&arr[0]的方式讓原本就很繞的邏輯變得更繞了,看著容易蒙圈……其實從變數型別的角度來看,能很快找到答案。賦值,必然是左右兩邊的型別相同(或者可以隱式轉換,例如整形的截斷和提升),指標也不例外。要想把右值賦給左值,那就先要動點腦子把右值變成左值的型別。如果賦值報錯,那一定是右值不能被賦值給左邊,原因無非兩種,要麼左邊不能被賦值,要麼右邊的型別不能被轉化為左邊的。這個問題是在講解陣列指標的應用,到這了,你需要對複雜的混合變數型別有心理準備。陣列指標還只是一個小小的困難點。
祝好。