崔孝鳳
摘要:針對(duì)C語言中的各類地址進(jìn)行了討論,提出了深入理解C語言的各類地址的存儲(chǔ)原理能夠更好地理解和學(xué)習(xí)C語言,對(duì)初學(xué)者具有很好的啟發(fā)和引領(lǐng)作用。
關(guān)鍵詞:C語言;地址;存儲(chǔ)單元;數(shù)據(jù)類型;數(shù)組
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)30-0232-02
對(duì)于初學(xué)C語言的同學(xué)來說,C語言的地址可謂一大難點(diǎn),如何正確地理解C語言中的各種地址關(guān)系到對(duì)不同數(shù)據(jù)類型的使用,直接關(guān)系到編程質(zhì)量,本文從C語言地址的含義、應(yīng)用等方面解析,對(duì)C語言學(xué)習(xí)者起到啟發(fā)和引領(lǐng)作用。
1 C語言地址的基本概念
C語言地址,是指內(nèi)存地址的概念。計(jì)算機(jī)內(nèi)存中的各個(gè)存儲(chǔ)單元都是有序的,按字節(jié)編碼,這個(gè)編碼就是地址,可以把存儲(chǔ)單元的地址形象地理解成我們房屋的門牌號(hào)。
2 C語言中的地址種類
C語言的數(shù)據(jù)類型非常豐富,不同類型的變量所占的存儲(chǔ)單元大小是不一樣的,下面具體解析一下。
1)整型變量的地址
C語言中的整型變量可以分為短整型short int、基本整型int及長整型long int三種類型,這三種類型所占的內(nèi)存單元字節(jié)數(shù)是不一樣的,短整型變量一般是占用2個(gè)字節(jié),后面兩種一般是占用4個(gè)字節(jié),可以使用關(guān)鍵字sizeof返回,如可以使用語句printf("%d %d %d\n",sizeof(short int),sizeof(int),sizeof(long int));來返回這三種數(shù)據(jù)類型的變量所占的內(nèi)存字節(jié)數(shù)。
2)實(shí)型變量的地址
C語言中的實(shí)型變量可以分為單精度實(shí)型float、雙精度實(shí)型double及長雙精度實(shí)型long double三種類型,在內(nèi)存中分別占用4、8、16個(gè)字節(jié),可以使用語句printf("%d %d %d\n",sizeof(float),sizeof(double),sizeof(long double)); 來返回這三種數(shù)據(jù)類型的變量所占的內(nèi)存字節(jié)數(shù)。
3)字符型變量的地址
C語言中的字符型變量就是char,占用1個(gè)字節(jié)??梢允褂谜Z句printf("%d\n",sizeof(char));來返回一個(gè)字符型變量在內(nèi)存中所占的字節(jié)數(shù)。
4)數(shù)組的地址
C語言中的數(shù)組存儲(chǔ)的是同一種類型的數(shù)據(jù),它們的存儲(chǔ)單元是連續(xù)的一片存儲(chǔ)空間。一個(gè)數(shù)組所占單元的多少既跟數(shù)組的數(shù)據(jù)類型有關(guān)系,也跟數(shù)組的大小密切相關(guān),比如如果有這樣的定義int a[10];那么數(shù)組a所占空間就應(yīng)該是10*4即40個(gè)字節(jié),可以使用語句printf("%d\n",sizeof(a));來輸出數(shù)組a所占的內(nèi)存單元所占字節(jié)數(shù),確實(shí)是40個(gè)字節(jié)。如果是double a[10];呢,顯然數(shù)組a所占內(nèi)存空間就應(yīng)該是10*8即80個(gè)字節(jié),所以數(shù)組在使用前一定首先要定義好,這是很明顯的道理。這兒需要說明一下的是數(shù)組的首地址,C語言中規(guī)定數(shù)組名表示了數(shù)組的首地址,即對(duì)于數(shù)組a來說,a就相當(dāng)于&a;[0],所以由此我們?cè)诰幊讨芯涂梢院芊奖愕卦L問到數(shù)組中的所有元素。
5)指針的地址
C語言的指針可以說是C語言的靈魂所在,我們說指針就是地址,那么指針也是C語言的一種數(shù)據(jù)類型,它的地址占幾個(gè)字節(jié)呢?不管指針指向什么類型的變量,它所占的內(nèi)存空間都是8個(gè)字節(jié)(說明:一般編譯器會(huì)把指針的長度定義為系統(tǒng)的字長),比如int i,*pi=&i;;
char ch,*pch=&ch;; double f,*pf=&f;; printf("%d\n",sizeof(pi)); printf("%d\n",sizeof(pch)); printf("%d\n",sizeof(pf));我們都會(huì)得到相同的結(jié)果8。
3 C語言中不同地址的應(yīng)用
1)基本數(shù)據(jù)類型地址的應(yīng)用
C語言的基本數(shù)據(jù)類型是指基本整型int、實(shí)型float和字符型char,對(duì)于這三種基本類型,當(dāng)定義變量時(shí)系統(tǒng)就會(huì)給它們分配相應(yīng)的內(nèi)存單元,對(duì)它們進(jìn)行賦值等操作時(shí),系統(tǒng)會(huì)直接從相應(yīng)的內(nèi)存單元地址中取出相應(yīng)的值直接進(jìn)行操作。對(duì)于編程者來說,此時(shí)感覺不到地址的作用,其實(shí)地址隨時(shí)在起作用,比如下面的程序例子。
#include
int main(void)
{int a;
printf("請(qǐng)輸入一個(gè)整數(shù):\n");
scanf("%d",&a;);
a=a+1;
printf("a=%d\n",a);
return 0;
}
從一開始定義變量a,系統(tǒng)首先給變量a分配內(nèi)存地址,然后使用scanf輸入數(shù)據(jù),輸入的數(shù)據(jù)保存到了變量a的內(nèi)存地址中,當(dāng)執(zhí)行語句a=a+1;進(jìn)行運(yùn)算時(shí)系統(tǒng)會(huì)首先從變量a的相應(yīng)存儲(chǔ)地址單元中取出變量a的值,運(yùn)算完后再把結(jié)果保存到變量a的存儲(chǔ)單元中,最后使用printf輸出變量的值時(shí)也需要從變量的存儲(chǔ)單元中取出變量a的值。所以整個(gè)程序執(zhí)行過程中一直在使用變量a的地址,不過用戶渾然不覺罷了。
2)數(shù)組地址的應(yīng)用
C語言中的數(shù)組是一組名稱相同類型相同的數(shù)據(jù)的集合,數(shù)組名稱代表了數(shù)組的起始地址,一旦定義數(shù)組,系統(tǒng)就給該數(shù)組分配一片連續(xù)的相應(yīng)的存儲(chǔ)空間。對(duì)數(shù)組的使用其實(shí)就是對(duì)數(shù)組元素的各種操作,既可以使用下標(biāo)元素的方式使用,也可以使用地址的方式,使用下標(biāo)方式對(duì)初學(xué)者來說更好理解,使用地址方式更接近地址本質(zhì),編程者可以根據(jù)自己的喜好選擇喜歡的方式。
請(qǐng)看下面的程序:
程序功能:從鍵盤上輸入10個(gè)整數(shù),然后再在屏幕上輸出來。
程序源代碼如下:
#include
int main(void)
{int a[10],i;
printf("請(qǐng)輸入10個(gè)整數(shù),用空格分隔:\n");
for(i=0;i<10;i++)
scanf("%d",&a;[i]);//或者使用語句:scanf("%d",a+i);
printf("您剛才輸入的10個(gè)整數(shù)如下:\n");
for(i=0;i<10;i++)
printf("%d ",*(a+i));//或者使用語句:printf("%d ",a[i)]);
return 0;
}
說明:輸入數(shù)據(jù)scanf("%d",&a;[i]);時(shí)使用的是對(duì)數(shù)組元素直接訪問的方式,輸出數(shù)據(jù)printf("%d ",*(a+i));時(shí)使用的是對(duì)數(shù)組元素間接訪問的方式,其中a+i表示的就是第i個(gè)元素的地址,利用間接取值運(yùn)算符*取出數(shù)組元素的值。
如果在程序中加一行代碼依次輸出10個(gè)數(shù)組元素的地址的話,如:
for(i=0;i<10;i++)
printf("%d ",a+i);
可能會(huì)看到如下的結(jié)果:
6487584 6487588 6487592 6487596 6487600 6487604 6487608 6487612 6487616 6487620
從這個(gè)結(jié)果可以清楚地看出,數(shù)組的地址是連續(xù)的,每相鄰兩個(gè)元素的地址相差4個(gè)字節(jié),正好是int型變量在內(nèi)存中所占字節(jié)數(shù),顯然,如果是字符型的話,每兩個(gè)元素之間相差的地址就應(yīng)該是1個(gè)字節(jié),我們可以方便地驗(yàn)證。就是說,不同類型的數(shù)組,每個(gè)元素所占的地址空間是跟所屬類型相對(duì)應(yīng)的。從這個(gè)例子我們進(jìn)一步明白C語言中的數(shù)據(jù)的確是存儲(chǔ)在相應(yīng)內(nèi)存單元中的。
4 結(jié)論
C語言中每一個(gè)變量和函數(shù)都對(duì)應(yīng)著相應(yīng)的地址,正確理解各類地址有利于對(duì)C語言更深入的理解和掌握,相信本文對(duì)地址的探討對(duì)初學(xué)C語言的讀者能夠起到一定的啟發(fā)和引領(lǐng)作用。
參考文獻(xiàn):
[1] 劉林香,許燕青. 談C語言中指針、地址和數(shù)組的相互關(guān)系[J].硅谷,2009-01-23.
[2] 郭偉剛. C語言教學(xué)中運(yùn)用printf函數(shù)幫助學(xué)生理解地址和指針[J]. 計(jì)算機(jī)教育,2008-12-10.
[3] 陸云飛. 淺談C語言數(shù)據(jù)與內(nèi)存分配空間和地址的聯(lián)系[J].科技信息,2006-08-05.
[4] 楊延玉. C語言中的地址類型[J]. 平原大學(xué)學(xué)報(bào),2005-12-20.
[5] 魏力生,朱方洲. 談如何掌握C語言中數(shù)組、指針與地址相互關(guān)系[J].電腦知識(shí)與技術(shù),2003-04-15.
【通聯(lián)編輯:王力】