6.指標和多維陣列
就拿陣列int array[5]
[2]舉例
array 是乙個占用兩個int大小物件的位址
array[
0] 是乙個占用乙個int大小物件的位址
故此,可以理解給array+
1和array[0]
+1不同之處
畢竟,乙個代表著兩個int單位,乙個則代表著乙個
array是位址的位址,必須解引用兩次才能獲得原始值
int
(* pz)[2
]//pz指向乙個(內含兩個int型別值的)陣列
int* pax [2]
//pax是乙個(內含兩個指標元素的)陣列,每個元素都指向int的指標
因為的優先順序較高
而對於array來說,指標必須指向乙個內含兩個int型別值的陣列,而不是指向乙個int型別值
然後嘞,* pz=array就okk了
不得不說,c語言博大精深,下面特批上人話:
這個二維陣列呢,講究的是雙重解引,把這個pz指標設成了乙個含兩個int型別的陣列,就可以保證,在給pz+1或者+2的時候,這個pz都是兩個兩個地動(即,以主陣列為單位地動)
舉個栗子:
*(*
(pz+2)
+1)
那這次pz指標指向的是神馬東東呢??
原來是array陣列裡第三個主陣列裡的第二個元素~~
好的,那麼這點跨過去之後,再就指標相容性談談
7.指標的相容性
指標的賦值與數值型別確實要嚴格,比如,就不能把int型別的賦給double
int n=5;
double x;
int* pl=
&n;double
* pd=
&x;x=n;
//隱式型別轉換
pd=pl;
//編譯不通過
不僅如此,還有以下更複雜的栗子
int
* pt;
int(
*pa)[3
];int ar1[2]
[3];
int ar2[3]
[2];
int*
*p2 //乙個指向指標的指標
pt=&ar1[0]
[0];
//都是指向int的指標
pt=ar1[0]
;//都是指向int的指標
pt=ar1;
//無效
pa=ar1;
//都是指向內含3個int型別元素陣列的指標
pa=ar2;
//無效
p2=&pt;
//both pointer-to-int * ps:這一點呢,我還沒太搞懂,以後再談指向指標的指標
*p2=ar2[0]
;//都是指向int的指標
p2=ar2;
//無效 ps:p2是指向指標的指標。它指向的指標指向int,而ar2是陣列的指標,該陣列內含兩個int型別的元素,所以無效
雖然指標的指標還沒get到點,但是,這裡有個**就是按照這個亞子執行的
#include
int main ();
pt=zippo;
p2=&pt;
printf
("%d",*
*p2)
;return0;
}
輸出的結果是2
中間插乙個指標定義的**哈
#include
int main ();
int* pt=array;
printf
("%d"
,* pt)
;return0;
}
輸出結果是5
const
把const指標賦值給非const指標不安全,因為可以用新的指標改變const指標指向的資料
反過來還是ok的
但是,前提是只進行一級引用
所以還是秉承著指標相容性的法則,把**寫的更合理吧~~
這篇就寫到這裡吧,またね!
C語言指標學習 二
1.c語言中,實參變數與形參變數之間的資料傳遞,是單向的 值傳遞 方式。指標變數做函式引數也要遵循這一規則。呼叫函式不可能改變實參指標變數的值,但可以改變實參指標變數所指向變數的值。我們知道函式的呼叫可以得到乙個返回值,而運用指標變數做引數,可以得到多個變化了的變數值。2.在主調函式中宣告所要求的數...
c語言學習筆記(十四 指標二
1.指標的算術運算char a 20 int ptr int a 強制型別轉換並不會改變a 的型別 ptr 指標ptr 的值加上了sizeof int 由於位址是用位元組做單位的,故ptr 所指向的位址由原來的變數a 的位址向高位址方向增加了4 個位元組。2.和 這裡 是取位址運算子,是間接運算子。...
c語言指標學習筆記
example 1 int a,b,p,q p a p a p q b p p a 錯誤,因為p實際上是乙個位址,而a是乙個整型值 p q 錯誤,因為這句話的意思是 將位址q指向的單元的值賦給位址p。而實際上p是乙個位址,是不能存值得 p a 錯誤 注意,如果這樣定義了 p,那麼 p表示位址 指標 ...