指針在C語言中具備十分高的地位。掌握指針的使用方法是一個C語言程序員應該具備的基礎技能。總之,指針十分重要。不少初學者對於這一部分的知識表示很難理解,因而可知指針是C語言學習的一個難點。本文嘗試用類比和舉例的方法幫助各位初學者朋友理解指針。程序員
如下這段話源自譚浩強的《C語言程序設計》,給出了指針的具體定義。數據結構
對每個變量,它在內存中都有一個存儲位置,這個位置就是該變量的地址,對變量值的存取是經過地址進行。在C語言中這個地址被形象化地稱爲「指針」。學習
由上面的這段話能夠得知,指針的本質實際上是地址,指針變量就是存放另外一變量的地址。咱們能夠利用指針直接對內存進行操做,利用存放變量的地址找到變量。舉一個貼近生活的例子,把一個地區比做內存,房子比做指針,居民比做變量。咱們要在內存找一個變量,能夠根據指針。就如在一個地區要找一我的,咱們能夠經過尋找這我的的住址把這我的造出來。通常來講,地址是不會輕易改變的。若是咱們須要指定某些特定的內存地址存儲的變量進行某些操做,都會利用到指針。這就比如A住在房子甲,街道須要房子甲的住戶打掃門前衛生,這時能夠經過地址找到A打掃衛生。若是A在某天搬到房子乙,而B住進了房子甲。打掃房子甲門前衛生的就是B,打掃房子乙門前衛生的就是A。設計
說到指針的好處,網上不少的大神也提過。因爲本人實踐的經驗很少,一些未驗證過的觀點在此就不做太多介紹。只對一下兩點做出解釋。指針
指針能夠提升效率。C語言是一種偏底層的語言,爲了更直接對內存進行操做,必須使用指針。由於指針是根據內存的地址來操做變量。瞭解過彙編語言的朋友,可能會知道彙編語言中有尋址這個操做,指針和尋址有殊途同歸之妙。另外,若是須要傳輸大量的數據,能夠經過傳輸起始地址和結束地址來代替(即傳遞指針),前提是儲存的數據地址必須是連續的。code
提升靈活度。瞭解過數據結構的朋友都知道鏈式儲存結構。儘管數據的儲存單位不是連續的,但並不影響這些數據的邏輯關係。指針就是實現鏈式儲存結構的橋樑,經過指針把這些分散在內存不一樣地方的數據聯繫起來。內存
如下實例定義了一個整形數值i和整形指針變量p,經過 p來獲得i的值。其中 "*" 不是乘號,而是指針變量的標誌,在變量前加上它,說明變量是指針變量。"&"是取地址符號,在某個變量前加上它,能夠得到這個變量的地址。io
#include <stdio.h> int main() { int i,*p;//定義整形變量i和整形指針變量*p i = 6;//賦值 p = &i;//p指向i的地址 printf("the value of i is %d\n",i);//i的值 printf("the value of &i is %d\n",&i);//i的地址的值 printf("the value of p is %d\n",p);//p指向地址的值 printf("the value of *p is %d\n",*p);//經過p指向的地址找到的值 return 0; }
運行結果:i的值是6,地址是1638212。p指向的地址也是1638212。程序設計
the value of i is 6 the value of &i is 1638212 the value of p is 1638212 the value of *p is 6
接下來咱們看一下更加有趣的例子效率
#include <stdio.h> int main() { int i,*p;//定義整形變量i和整形指針變量*p i = 6;//賦值 p = &i;//p指向i的地址 printf("the value of i is %d\n",i);//i的值 printf("the value of *(&i) is %d\n",*(&i));//指向i地址指針的值 printf("the value of &i is %d\n",&i);//i的地址的值 printf("the value of &(*p) is %d\n",&(*p));//p指針指向的值的地址 return 0; }
運行結果:
the value of i is 6 the value of *(&i) is 6 the value of &i is 1638212 the value of &(*p) is 1638212
雖然這兩個實例看起來好像,可是經過第二個實例能夠總結出一個頗有用的結論:通常來講,咱們能夠把*p當作一個變量,這個變量指向誰就等價於誰。
如:&i的值和&(*p)的值是相同的,說明i和指針*p是等價的。
#include <stdio.h> int main() { int a,b,*p,*q;//定義整形變量a,b和整形指針變量*p,*q a = 1;//a賦值 b = 9;//b賦值 p = &a;//p指向a的地址 q = &b;//q指向b的地址 printf("before exchange: a is %d,b is %d\n",*p,*q); p = &b;//p指向b的地址 q = &a;//q指向a的地址 printf("after exchange: a is %d,b is %d\n",*p,*q); return 0; }
運行結果:
before exchange: a is 1,b is 9 after exchange: a is 9, b is 1
以上實例利用指針實現兩個變量數值的交換。指針p原本是指向a的地址,交換後指針p指向b的地址,因此經過指針p找到的值就是b。同理可知指針q交換後指向a的地址。
再舉一個例子幫助理解,若是把a和b比做兩我的,p和q比做身份證,交換a和b的值比做交換身份。本來經過身份證p找到的人是a,經過身份證q找到的人是b。如今兩人交換身份,身份證p照片改爲是b的,身份證q照片改爲a的。經過身份證p找到的人固然是b,經過q找到的人就是a了。
以上介紹了C語言指針的基礎內容,包括指針概念、定義指針的方法和指針的簡單使用實例。更多的內容會在往後的文章中提到。ps:以上內容是本人學習指針內容的心得,因爲指針內容確實是一個難點,若有大神發現文中內容有不足之處但願可以提點。