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