c語言指針其實(shí)只需要理解兩個(gè)東西就可以了。
1. ? *? 的含義(取值符)
2.? ? &? 的含義(取地址符)
指針的定義:
數(shù)據(jù)類型 *指針變量;? ? ? 例如:int *p;
下面我們來看一下下面的程序:
運(yùn)行的結(jié)果為:
我們來看一下計(jì)算機(jī)底層是怎么儲(chǔ)存的:
下面解釋圖1程序:
第三行,定義一個(gè)int類型的變量a,并將整數(shù)5儲(chǔ)存到變量a中的儲(chǔ)存空間中
第四行,定義一個(gè)指針p,即為指針變量p分配一塊儲(chǔ)存空間(如圖3)
第五行,將指針p指向變量a的物理地址(通俗的話就是指針p的儲(chǔ)存空間中儲(chǔ)存a的物理地址)
第六行,以十六進(jìn)制輸出p,p實(shí)際上就是變量p的儲(chǔ)存空間中的數(shù)據(jù),即62fe44(地址是隨機(jī)分配的)
第七行,以十六進(jìn)制輸出&a,即變量a的物理地址
第八行,以十進(jìn)制輸出a,這個(gè)就不解釋了,你懂的
第九行,以十進(jìn)制輸出*p,*p即表示變量p儲(chǔ)存空間中的物理地址的值(變量a的值)
指針就是操作內(nèi)存的實(shí)際物理地址。
所以理解*與&兩個(gè)符號(hào)的意義就可以了
總結(jié):
1.指針就是用來儲(chǔ)存變量的物理地址,如
int *p;
int a=5;
p=&a;
上面指針變量p就是儲(chǔ)存了變量a的物理地址。
2.變量p前加個(gè)*,即*p,就是變量a中的數(shù)據(jù)5.
3.&符號(hào)是取地址符號(hào),如&a,表示的就是a的物理地址
所以說,指針不難,只要理解*與&的含義就可以了。
如果你還沒有完全理解,那就自己多去敲代碼嘗試吧,再多看幾遍,如果你懂了上面的,那么接著看下面的。
下面為擴(kuò)展知識(shí):
既然指針(一重指針)是用來儲(chǔ)存普通變量的地址的,那么指針的物理地址用什么來儲(chǔ)存呢?
答案是:二重指針。
二重指針的定義:
int **p;
在這里你是否又想到了是否有三重指針呢?
答案是:有的。
既然是擴(kuò)展,在此,直接上圖,有興趣的可以去了解。
運(yùn)行結(jié)果:
最后附上計(jì)算機(jī)是如何存儲(chǔ)的原理圖:
上圖中沒有寫出三重指針 p_pp的地址,如果想知道其地址,只需要寫下面這個(gè)代碼就可以了。
printf("%x",&p_pp);
要理解這個(gè)程序你必須自己去把這個(gè)代碼敲出來,運(yùn)行,然后一點(diǎn)一點(diǎn)的去理解,如果圖4的程序你能理解透徹,說明你對(duì)指針已經(jīng)有深刻的理解了。