2016-03-13 181 views
-4
int r = 50; 
int *p; 
int **k; 
int ***m; 
printf("r: %d ", r); 
p = &r; 
k = &p; 
m = &k; 
***m = 100; //line 9 
printf("r: %d\n", r); 

當只有一個指針,我可以理解,我們採取100,我們在它這是正在舉行的指針的地址賦給變量。但是,當我們使用多個指針級別執行此操作時,究竟發生了什麼? (第9行)指針的指針如何在這個C代碼中工作?

+2

發生了什麼事,當你試了一下,用你的調試器逐句通過,在每一步製作varible值的注意事項? –

+1

@MartinJames首先是50,而不是100.但是,分配給第9行我想知道的是什麼。 – madkobra

+0

@MartinJames:問題是還有誰不使用''*** ... – Olaf

回答

-4

指向指針或多行指針r地址被傳遞到指針p! 然後,如果你路過的p地址到另一個指針k那麼對於非關聯化的實際值要取消對它的引用兩次獲得r等實際值。

看一看圖像

enter image description here

+5

尼斯圖形太多的三星級C-程序員,但你爲什麼有箭頭指向*爲*指針,而不是從指向他們指向數據的指針?我擔心這可能會造成混淆,而不是幫助。 –

+0

因爲「K = &p ;」,在指針「P」的這個地址被傳遞到第2級的指針數k! –

+2

是啊......但指針*指向*東西..就像箭頭*指向* ..東西。 –

1

原因指針到指針的作品,是一個指針是一個變量,太。它只是存儲地址。所以指針指針是包含地址的變量的地址。

enter image description here

在該圖v是可變的,含有100及其地址是1000。ptr包含v的地址,這是1000 pptr包含ptr的ADDRES,這是720

1

int *p=&rppointer-to-int,它需要的address of r

int **k=&pkpointer-to-(pointer-to-int),它需要的address of p

int ***m=&kmpointer-to-(pointer-to-(pointer-to-int)),它需要的address of k

當你做***m = 100,你是「解開」的指針,最後你最終只是int

+0

賦值不會使變量成爲指針。這是它的聲明。 – Olaf

+0

@Olaf yup。編輯答案,以便它讀得更好。 – Lincoln

+0

你錯過了我的觀點。請再次閱讀我的評論。 – Olaf