指針是變量,那必然會(huì)有變量類型,因此這里必須對變量類型做解釋。在C語言中,所有的變量都有變量類型,整型、浮現(xiàn)型、字符型、指針類型、結(jié)構(gòu)體、聯(lián)合體、枚舉等,這些都是變量類型。變量類型的出現(xiàn)是內(nèi)存管理的必然結(jié)果,相信讀者知道,所有的變量都是保存在計(jì)算機(jī)的內(nèi)存中,既然是放到計(jì)算機(jī)的內(nèi)存中,那必然會(huì)占用一定的空間,問題來了,一個(gè)變量會(huì)占用多少空間呢,或者說應(yīng)該分出多少內(nèi)存空間來放置該變量呢?為了規(guī)定這個(gè),類型由此誕生了,對于32位編譯器來說,int類型占用4個(gè)字節(jié),即32位,long類型占用8字節(jié),即64位。這里簡單說了類型主要是為后面引出指針這個(gè)特殊性,在計(jì)算機(jī)中,將要運(yùn)行的程序都保存在內(nèi)存中,所有的程序中的變量其實(shí)就是對內(nèi)存的操作。
#include "stdio.h"
int main(int argc, char **argv)
{
unsigned int a = 10;
unsigned int *p = NULL;
p = &a;
printf("&a=%d\n",a);
printf("&a=%d\n",&a);
*p = 20;
printf("a=%d\n",a);
return 0;
}
運(yùn)行之后,結(jié)果如圖:
指針也是一個(gè)變量,那個(gè)指針也應(yīng)該被存放在內(nèi)存中,對于32位編譯器來說,其尋址空間為2^32=4GB,為了能夠都操作所有內(nèi)存(實(shí)際上普通用戶不可能操作所有內(nèi)存),指針變量存放也要用32位數(shù)即4個(gè)字節(jié)。這樣就有指針的地址&p,指針和變量的關(guān)系可以用如下圖表示:
從上圖可以看到&p
是指針的地址,用來存放指針p
,而指針p
來存放變量a
的地址,也就是&a
,還有一個(gè)*p在C語言中是解引,意思是告訴編譯器取出該地址存放的內(nèi)容。
對于不同類型指針而言,其p+1
所指向的地址不同,這個(gè)遞增取決于指針類型所占的內(nèi)存大小,而對于((unsigned int)p)+1
,該意思是將地址p所指向的地址的值直接轉(zhuǎn)換為數(shù)字,然后+1
,這樣無論p是何種類型的指針,其結(jié)果都是指針?biāo)傅牡刂泛笠粋€(gè)地址。
從上述可以看到,指針的存在使得程序員可以相當(dāng)輕松的操作內(nèi)存,這也使得當(dāng)前有些人認(rèn)為指針相當(dāng)危險(xiǎn),這一觀點(diǎn)表現(xiàn)在C#和Java語言中,然而實(shí)際上用好指針可以極大的提高效率。下面深入一點(diǎn)來通過指針對內(nèi)存進(jìn)行操作,現(xiàn)在我們需要對內(nèi)存6422216中填入一個(gè)數(shù)據(jù)125,我們可以如下操作:
unsigned int *p=(unsigned int*)(6422216);
*p=125;
-
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135864 -
指針變量
+關(guān)注
關(guān)注
0文章
17瀏覽量
7227
發(fā)布評論請先 登錄
相關(guān)推薦
評論