劉林香 許燕青 江忠君
[摘要]在學習C語言過程中,指針、地址和數(shù)組是最富有特色的內(nèi)容,特別是指針、地址和數(shù)組之間相互關(guān)系更具有特色。掌握它們之間的相互關(guān)系將有助于C語言其他內(nèi)容的學習,因此學好這部分內(nèi)容是掌握C語言的關(guān)鍵。主要用圖示法闡述指針和地址、指針和數(shù)組之間的聯(lián)系。
[關(guān)鍵詞]C語言 指針 地址 數(shù)組 圖示法
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)0120049-01
指針是C語言中一個最重要概念之一,指針變量是用來存放另外一個變量地址,通過指針變量可以間接引用另外一個變量的內(nèi)容。數(shù)組是由若干個元素按一定順序關(guān)系組合而成的集合體,即數(shù)組中的每一個元素都屬于同一個數(shù)據(jù)類型,數(shù)組名則是數(shù)組元素的首地址,用戶在編程中用一個數(shù)組名和下標來唯一確定數(shù)組中的每一個元素。所以,指針、地址和數(shù)組以及它們之間的相互關(guān)系構(gòu)成C語言最有特色部分。
一、指針和地址
(一)指針變量的定義
在程序中定義了一個變量,那么在計算機內(nèi)不僅定義了該變量的類型、名稱,而且還在內(nèi)存中分配了一塊存儲區(qū)域,這塊存儲區(qū)域的首地址稱為該變量的指針。變量的值就存放在這塊區(qū)域之中,在計算機內(nèi)部,通過訪問或修改這塊區(qū)域的內(nèi)容來訪問或修改相應(yīng)的變量。Turbo C語言中,對于變量的訪問形式之一,就是先求出變量的地址,然后再通過地址對它進行訪問。
指針變量的一般定義為:
類型標識符*標識符;
其中“標識符”是指針變量的名字,標識符前加了“*”號,表示該變量是指針變量,而最前面的“類型標識符”表示該指針變量所指向的變量的類型。一個指針變量只能指向同一種類型的變量,也就是說,我們不能定義一個指針變量,既能指向一整型變量又能指向雙精度變量。如定義了一個指針變量int*ip;說明該指針變量ip為指向整數(shù)的指針,用它存放整型變量的地址。
(二)指針變量的引用
指針變量中只能存放地址,因此,在使用中不能將一個整數(shù)賦給一指針變量。如:
int *ip;ip=80;這種賦值是錯誤的??梢赃@樣定義:
int i=100,x;int *ip;
定義了兩個整型變量i,x,還定義了一個指向整數(shù)的指針變量ip。i,x中可存放整數(shù),而ip中只能存放整型變量的地址。通過地址運算“&”可以把i的地址賦給ip:
ip=&i
此時指針變量ip就指向整型變量i,假設(shè)變量i的地址為1600,這個賦值可理解為圖1所示的聯(lián)系。
可以通過指針變量ip間接訪問變量i,如:
x=*ip;
運算符*訪問以ip為地址的存儲區(qū)域,而ip中存放的是變量i的地址,因此,*ip訪問的是地址為1600的存儲區(qū)域,它就是i所占用的存儲區(qū)域,所以上面的賦值表達式等價于
x=i;
另外,指針變量和一般變量一樣,存放在它們之中的值是可以改變的,也就是說可以改變它們的指向,假設(shè)
Int i,j,*p1,*p2;
i=10 ;
j=20 ;
p1=&i
p2=&j
通過圖示法闡述如下:
如圖2所示,采用圖示法展示出普通變量i、j和指針變量p1、p2之間的關(guān)系,指針其實是內(nèi)存地址,而內(nèi)存中的單元是按字節(jié)編址(每個地址編碼對應(yīng)一個字節(jié)空間),從圖中可以看出整型變量i和j分別占用兩個字節(jié)的內(nèi)存空間。同時也可以看出每個指針變量也是占用兩個字節(jié)的空間,因為每個指針變量都是存儲一個地址碼。
通過指針訪問它所指向變量的值是以間接訪問的形式進行的,所以比直接訪問一個變量要多費時間,而且不直觀,因為通過指針要訪問哪一個變量,取決于指針的值(即指向),例如“*p2=*p1;”實際上就是“j=i;”,前者不僅速度慢而且目的不明。但由于指針是變量,可以通過改變它們的指向,以間接訪問不同的變量的值,這給程序員帶來靈活性,也使程序代碼編寫得更為簡潔、高效。
二、指針和數(shù)組
指針和數(shù)組有著密切的關(guān)系,任何能由數(shù)組下標完成的操作也都可用指針來實現(xiàn),而且使用指針處理數(shù)據(jù),有助于產(chǎn)生占用空間小,運行速度快且高質(zhì)量的目標代碼。
(一)指向數(shù)組元素的指針
在C語言中,數(shù)組的指針就是數(shù)組的起始地址(也就第一個元素的地址),如:
int a[10],*p;
對于數(shù)組a[i]表示數(shù)組a的第i+1個變量,a是數(shù)組名表示該數(shù)組的首地址,為常量,即a與&a[0]等價,而p=a則將數(shù)組a的首地址&a[0]賦給指針變量p。通過p來訪問數(shù)組元素時要注意以下問題:
1.P,a與&a[0]它們是等價的,都表示數(shù)組a的首地址。
2.p[i]和a[i]都是代表該數(shù)組的第i+1個元素。
3.p+i和a+i代表了第i+1個元素的地址,所以我們也可以使用*(p+i)和*(a+i)來引用對象元素。
4.表達式p+1為指向p的下一個存儲單元,即a[0]下一個元素a[1]的存儲單元,也就是p+1等價于&a[1]。
(二)指向二維數(shù)組的指針
為了說明問題,假設(shè)有如下程序段:
int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}},i,j,*p;
P=&a[0][0];
A為二維數(shù)組名,此數(shù)組有3行5列,共15個元素。也可這樣來理解,數(shù)組a由三個元素組成:a[0],a[1],a[2]。而每個元素又是一個一維數(shù)組,且都含有5個元素(相當于5列),例如,a[0]所代表的一維數(shù)組所包含的5個元素為a[0][0],a[0][1],a[0][2],a[0][3],a[0][4]。數(shù)組名a也代表二維數(shù)組的首地址,也可看成是二維數(shù)組第0行的首地址。a+1就代表第1行的首地址,a+2就代表第2行的首地址。如果此二維數(shù)組的首地址為1000,由于第0行有5個整型元素,所以a+1為1010,a+2也就為1020,如圖3所示。
把a[0],a[1],a[2]看成是一維數(shù)組名,可以認為它們分別代表它們所對應(yīng)的數(shù)組的首地址,也就是講,a[0]代表第0行中第0列元素的地址,即&a[0][0],a[1]是第1行中第0列元素的地址,即&a[1][0],根據(jù)地址運算規(guī)則,a[0]+1即代表第0行第1列元素的地址,即&a[0][1],a[i]+j即代表第i行第j列元素的地址,即&a[i][j]。將指針p指向二維數(shù)組a的首地址,p+1就指向下一個元素,由于每行5個元素,p+i*5+j就是第i行第j列元素的地址。
參考文獻:
[1]譚浩強,C程序設(shè)計(第二版),北京:清華大學出版社,1999.
[2]嚴桂蘭,C語言程序設(shè)計與應(yīng)用教程,福建:廈門大學出版社,2001.