指針是變量,那必然會有變量類型,因此這里必須對變量類型做解釋。在C語言中,所有的變量都有變量類型,整型、浮現型、字符型、指針類型、結構體、聯合體、枚舉等,這些都是變量類型。變量類型的出現是內存管理的必然結果,相信讀者知道,所有的變量都是保存在計算機的內存中,既然是放到計算機的內存中,那必然會占用一定的空間,問題來了,一個變量會占用多少空間呢,或者說應該分出多少內存空間來放置該變量呢?為了規定這個,類型由此誕生了,對于32位編譯器來說,int類型占用4個字節,即32位,long類型占用8字節,即64位。這里簡單說了類型主要是為后面引出指針這個特殊性,在計算機中,將要運行的程序都保存在內存中,所有的程序中的變量其實就是對內存的操作。
#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;
}
運行之后,結果如圖:
指針也是一個變量,那個指針也應該被存放在內存中,對于32位編譯器來說,其尋址空間為2^32=4GB,為了能夠都操作所有內存(實際上普通用戶不可能操作所有內存),指針變量存放也要用32位數即4個字節。這樣就有指針的地址&p,指針和變量的關系可以用如下圖表示:
從上圖可以看到&p
是指針的地址,用來存放指針p
,而指針p
來存放變量a
的地址,也就是&a
,還有一個*p在C語言中是解引,意思是告訴編譯器取出該地址存放的內容。
對于不同類型指針而言,其p+1
所指向的地址不同,這個遞增取決于指針類型所占的內存大小,而對于((unsigned int)p)+1
,該意思是將地址p所指向的地址的值直接轉換為數字,然后+1
,這樣無論p是何種類型的指針,其結果都是指針所指的地址后一個地址。
從上述可以看到,指針的存在使得程序員可以相當輕松的操作內存,這也使得當前有些人認為指針相當危險,這一觀點表現在C#和Java語言中,然而實際上用好指針可以極大的提高效率。下面深入一點來通過指針對內存進行操作,現在我們需要對內存6422216中填入一個數據125,我們可以如下操作:
unsigned int *p=(unsigned int*)(6422216);
*p=125;
-
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
指針變量
+關注
關注
0文章
17瀏覽量
7229
發布評論請先 登錄
相關推薦
評論