C語言指針初探
注意:1.以下所有代碼及運(yùn)行結(jié)果均在VS2017編譯器下成功編譯和運(yùn)行。
? ? ? ? 2.文章里面的代碼筆者會省略#include<stdio.h>,int main()等,僅展示一部分代碼,以減少文章篇幅。
首先聲明一個整數(shù)和一個整數(shù)指針:
int i;
int *p;
單純地看這兩個家伙,你會覺得這兩個家伙長的好像。就是指針多了一個*號而已。既然長的像,那會不會有什么關(guān)聯(lián)呢?肯定是有關(guān)聯(lián)的,既然i是個變量,那么p也應(yīng)該是個變量,只不過變量i存的是個整數(shù)值,變量p存的是地址而已。一般情況下,我們不想用到變量p存的地址的時候,就可以用*號把變量p存的地址所對應(yīng)的值取出來。接下來,我們通過編程來看看:
int i;
int *p;
i=2;
p=&i;
printf("%p,%p,%d,%d\n", p,&i,*p,i);
運(yùn)行結(jié)果為:00BCFE88, 00BCFE88, 2,2
從以上代碼及運(yùn)行結(jié)果可以看出,指針p就是變量,只不過它存的是i地址,而我們不想要它存的地址的時候,就可以利用*號來把地址所對應(yīng)的數(shù)值給取出來。
這又帶給我們一個思考,既然指針p是變量,能不能對指針p取地址呢?接下來,我們通過編程來看看:
printf("%p,%p,%d,%d,%p\n", p,&i,*p,i,&p);
運(yùn)行結(jié)果為:003AF940, 003AF940, 2,2,003AF934(地址值每次編譯會不一樣)
我們可以這樣來理解:
p<-->&i
*p<-->i
接下來,讓我們又來看看一個不可思議的現(xiàn)象,通過編程:
printf("%d, %d, %d\n", sizeof(int*), sizeof(char*), sizeof(double*));
printf("%d, %d, %d\n", sizeof(int), sizeof(char), sizeof(double));
運(yùn)行結(jié)果為:4, 4, 4
? ? ? ? ? ? ? ? ? ? ? 4, 1, 8
int的大小為4字節(jié),char的大小為1字節(jié),double的大小為8字節(jié)(在筆者的編譯器及電腦運(yùn)行的情況下)。那為什么指針都是4個字節(jié)呢(在筆者的編譯器及電腦運(yùn)行的情況下)?這個我們可以這么理解,指針變量存放的是地址,我們可以看到上面打印出來的地址都是16進(jìn)制數(shù)且都只有8位,而每一位16進(jìn)制數(shù)代表著4位二進(jìn)制數(shù),因此一個地址就代表了32位二進(jìn)制數(shù),這不正好是4個字節(jié)嗎(一個字節(jié)由8個二進(jìn)制位組成)?換句話說,只需要4個字節(jié)就可以保存指針變量了。當(dāng)然,這要根據(jù)cpu,編譯器,操作系統(tǒng)而定。至少,在筆者的編譯器和電腦運(yùn)行下,不同類型的指針大小就是4個字節(jié)。
關(guān)于指針的一小部分知識,筆者就先介紹到這里。