多級指針:把指針變量的地址放入到另外一個指針變量中去。程序員
# include <stdio.h> int main(void) { int i = 5; /* 由於i是int類型,把它的指針賦值於p的時候, p須要是int類型的指針變量 int * */ int * p = &i; /* 由於p是int * 類型,把它的指針賦值於q的時候, q須要是int指針類型的指針變量 即 int ** */ int ** q = &p; /* 道理同上 */ int *** r = &q; //q = &i; error 緣由:類型不同嘛,&i是int *,q是int ** printf("%d\n", ***r); /* 輸出5,不知道怎麼用文字來描述這個結果o( ̄▽ ̄)d */ return 0; }
動態內存和靜態內存的比較函數
靜態內存是由系統自動分配的,有系統自動釋放spa
靜態內存是在棧中分配的.net
動態內存是由程序員手動分配,手動釋放指針
動態內存是在堆分配的code
跨函數使用內存(很重要)blog
/* 跨函數使用內存 */ # include <stdio.h> void f(int ** q) { int i = 5; *q = &i; } int main(void) { int * p; f(&p); printf("%d \n",*p); return 0; } /* VC++6.0輸出結果: ========================= 5 ========================= 備註: 這種寫法是錯誤的!在調用完畢f函數以後,i的空間已經釋放, 因此main函數不能對其進行操做。 不報錯的緣由聽說是由於,軟件弱智…… */
上面的註釋已經代表了,這種寫法是錯誤的。正確的方式是建立一個動態內存。
內存
/* 動態內存跨函數使用, 這是正確的方式。 */ # include <stdio.h> # include <malloc.h> void f(int ** q) { *q = (int *)malloc(sizeof(int)); **q = 5; } int main(void) { int * p; f(&p); printf("%d \n",*p); return 0; } /* VC++6.0輸出結果: ========================= 5 ========================= 結論: 爲指針變量p動態建立一個空間,並把地址交給p保存, 這樣當f函數執行完畢以後,動態生成的空間不會被釋放。 */
恩恩,醬紫纔對 d=====( ̄▽ ̄*)bci
學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blogget