應學院要求,寫了一篇指標的學習心得,順便也寫成部落格發了吧…
先來說說我的理解,我把整個程式想象成乙個豪宅,每個變數是這座豪宅的每個房間,而指標就是這麼多房間中其中乙個房間的門牌號。接下來是官方的定義。
c語言裡,變數存放在記憶體中,而記憶體其實就是一組有序位元組組成的陣列,每個位元組有唯一的記憶體位址。cpu 通過記憶體定址對儲存在記憶體中的某個指定資料物件的位址進行定位。這裡,資料物件是指儲存在記憶體中的乙個指定資料型別的數值或字串,它們都有乙個自己的位址,而指標便是儲存這個位址的變數。也就是說:指標是一種儲存變數位址的變數。如下圖所示:
左側連續的十六進製制編號就是記憶體位址,每個記憶體位址對應乙個位元組的記憶體空間。而指標變數儲存的就是這個編號,也即記憶體位址。
在c語言中,指標的使用非常廣泛,因為使用指標往往可以生成更高效、更緊湊的**。總的來說,使用指標有如下好處:
1)指標的使用使得不同區域的**可以輕易的共享記憶體資料,這樣可以使程式更為快速高效;
2)c語言中一些複雜的資料結構往往需要使用指標來構建,如鍊表、二叉樹等;
3)c語言是傳值呼叫,而有些操作傳值呼叫是無法完成的,如通過被調函式修改呼叫函式的物件,但是這種操作可以由指標來完成,而且並不違背傳值呼叫。
指標的宣告比普通變數的宣告多了乙個一元運算子「」,而「」是間接定址或者間接引用運算子。如下圖,p是乙個指標,儲存著乙個位址,該位址指向記憶體中的乙個變數,*p則會訪問這個位址所指向的變數。
int
*p;// 宣告乙個 int 型別的指標 p
char
*p // 宣告乙個 char 型別的指標 p
int*arr[10]
// 宣告乙個指標陣列,該陣列有10個元素,其中每個元素都是乙個指向 int 型別物件的指標
int(
*arr)[10
]// 宣告乙個陣列指標,該指標指向乙個 int 型別的一維陣列
int*
*p;// 宣告乙個指標 p ,該指標指向乙個 int 型別的指標
注意指標陣列和陣列指標的區別
宣告乙個指標變數並不會自動分配任何記憶體,在對指標間接訪問之前,指標必須要初始化,如下圖所示:
/* 方法1:使指標指向現有的記憶體 */
int x =1;
int*p =
&x;// 指標 p 被初始化,指向變數 x ,其中取位址符 & 用於產生運算元記憶體位址
/* 方法2:動態分配記憶體給指標 */
int*p;
p =(
int*
)malloc
(sizeof
(int)*
10);// malloc 函式用於動態分配記憶體
free
(p);
// free 函式用於釋放一塊已經分配的記憶體,常與 malloc 函式一起使用,要使用這兩個函式需要標頭檔案 stdlib.h
未初始化指標的後果:如果乙個指標沒有被初始化,那麼程式不知道它會指向**,可能指向乙個非法位址,這樣會報錯,「運氣好的話」,會指向乙個合法位址,或許程式會正常執行,但是這個指標所指向的位址的變數的值會被惡意修改,到時候電腦可能就……
null 指標是乙個特殊的指標變數,本身是巨集定義的,其本質上就是0,表示不指向任何記憶體的空指標。但是null在c和c++裡的用法又是不一樣的,就不多細說了。可參考這篇c/c++中對null的理解與總結。
在這裡就簡略描述一下:指標的運算、指標與陣列、指標與結構、指標與函式等…可參考:c語言常見的幾種指標用法。
指標在計算機裡充當著乙個很重要的角色,我們要了解它,要弄懂它,我們要做豪宅的主人,不要做豪宅的客人!
參考:
做情緒的主人
看別人不順眼,是自己修養不夠。人憤怒的那乙個瞬間,智商是零,過一分鐘後恢復正常。人的優雅關鍵在於控制自己的情緒。用嘴傷害人,是最愚蠢的一種行為。乙個能控制住不良情緒的人,比乙個能拿下一座城池的人強大。藏在內心的不良情緒在生活中時時湧現 從前,在乙個水池裡,住著乙隻壞脾氣的烏龜,他和來這裡喝水的兩隻大...
軟體精英 做主人還是做僕人
在最近召開的第九屆軟體產業博覽會的分論壇之一 軟體產業國際化與外包服務國際峰會 simchina2005 上,談得最多的依然是老話題 人才培養。無獨有偶,在麥肯錫發布的報告中,也依然把人才問題放在了制約中國軟體外包產業的首位。與會的國內外專家更是一致認為,軟體人才 尤其是中高階人才的缺乏是最大的攔路...
軟體精英 做主人還是做僕人
在召開的第九屆軟體產業博覽會的分論壇之一 軟體產業國際化與外包服務國際峰會simchina2005 上,談得最多的依然是老話題 人才培養。無獨有偶,在麥肯錫發布的報告中,也依然把人才問題放在了制約中國軟體外包產業的首位。與會的國內外專家更是一致認為,軟體人才 尤其是中高階人才的缺乏是最大的攔路虎,也...