黃國軍
(黃岡職業(yè)技術(shù)學(xué)院計算機(jī)科學(xué)與技術(shù)系,湖北黃岡438002)
C++語言中指針變量與數(shù)組的關(guān)系剖析*
黃國軍
(黃岡職業(yè)技術(shù)學(xué)院計算機(jī)科學(xué)與技術(shù)系,湖北黃岡438002)
C++語言中的指針變量和數(shù)組的關(guān)系非常密切。掌握指針變量與數(shù)組的關(guān)系是學(xué)好C++語言課程的難點,也是重點。就不同級別的指針變量與不同維數(shù)的數(shù)組之間的關(guān)系進(jìn)行剖析,以便明確教學(xué)重難點。
指針變量;地址;數(shù)組
運用指針編程是C++語言最主要的風(fēng)格之一,指針極大豐富了C++語言的功能。指針就是地址,指針變量是專門存放地址的變量;一個數(shù)組的數(shù)組名表示該數(shù)組在內(nèi)存中存放的地址,地址就是指針,故數(shù)組名也是指針;在C++語言中能進(jìn)行地址操作的除了指針變量外還有數(shù)組名。指針從級別上來講常用的有一級指針、二級指針。一級指針每次加1表示下移一個基類型的字節(jié)數(shù)(列移動);二級指針每次加1表示下移一組基類型的字節(jié)數(shù)(行移動)。從性質(zhì)來講有常量指針與變量指針。常量指針就是數(shù)組名,它的值是不能改變的,不能放在賦值符號的左邊。變量指針的值是允許被改變的,可以根據(jù)需要在程序的不同位置賦不同的值。為方便后面的講述,現(xiàn)假設(shè)有如下定義語句:
從級別上來分,一級指針有pa和a;二級指針有pb、pc、pd和b。從性質(zhì)來分常量指針有a、b、pc;變量指針有pa、pb、pd。下面分別就它們間的關(guān)系進(jìn)行討論。
pa是一級指針變量,它的值可以被改變;而a是一級指針常量,它始終代表數(shù)組a中首元素的地址,其值不能改變。當(dāng)通過語句pa=a或pa=&a [0]讓指針變量pa與一維數(shù)組a建立了如圖1所示關(guān)系。
圖1一級指針變量pa與一維數(shù)組a
對數(shù)組a中第i(0≤i≤4)個元素的訪問有四種形式a[i]、pa[i]、*(a+i)和*(pa+i)。它們之間是等價關(guān)系,可以相互替換。p是一個指針變量,它可以通過與自增運算符++或自減運算符——相結(jié)合來訪問所指數(shù)組中的每一個元素;而a是一個指針常量,故不能。對數(shù)組a中第i個元素的地址的表示有a+i與p+i兩種表示形式。由于指針變量pa與數(shù)組名a都是一級指針,只要pa始終指向數(shù)組a的首元素,它們的關(guān)系是等價的,在出現(xiàn)數(shù)組名a的地方都可以用pa替換。
一級指針變量pa可以訪問二維數(shù)組b。二維數(shù)組b中的元素在內(nèi)存中是按行存放的,它首先按從左到右的順序在內(nèi)存中存放第一行的元素后,再按從左到右的順序存放第二行元素,如圖所示:b [0][0]的下一個元素是b[0][1],b[0][3]的下個元素是b[1][0]。當(dāng)通過語句pa=b或pa=&b[0] [0]讓一級指針變量pa指向二維數(shù)組b的首元素后,它們的關(guān)系如圖2所示。
對二維數(shù)組b中第i(0≤i≤2)行j(0≤j≤3)列元素的訪問有b[i][j]、pa[i*4+j]、*(*(b+i)+ j)和*(pa+i*4+j)四種形式。在通過鍵盤給數(shù)組b中的逐個元素格式化賦值時,訪問的是它們的地址;對數(shù)組b中第i(0≤i≤2)行j(0≤j≤3)列元素的地址的表示有*(b+i)+j、b[i]+j、p+i*4+ j三種表示形式。由于pa是一級指針而b是二級指針,一個是按列移動,另一個按行移動,它們是不等價的,這就決定了在數(shù)組名b出現(xiàn)的地方如果用pa來替換必須進(jìn)行一定的處理。
圖2一級指針變量pa與二維數(shù)組b
C++語言中,二級指針變量與二維數(shù)組名都是二級指針。它們之間能否建立關(guān)系的首要條件要看二級指針變量能否確定它所指向二維數(shù)組的列寬,次要條件是二級指針變量所指的一維數(shù)組的元素個數(shù)與二維數(shù)組的列寬是否相等,兩者缺一不可。
二級指針變量有指向指針的指針變量pb和指向一維數(shù)組的指針變量pd。二級指針變量pb一般存放另一個一級指針變量的地址。因為二級指針變量pb不能確定它所指向的二維數(shù)組的列寬,所以它不能與一個二維數(shù)組建立指向關(guān)系。
圖3指向一維數(shù)組的指針變量pd與二維數(shù)組b
從上面的定義可以看出指向一維數(shù)組的指針變量pd所指一維數(shù)組含有4個元素,二維數(shù)組b中的列寬為4??梢酝ㄟ^語句pd=b或pd=&b[0] [0]讓一維數(shù)組的指針變量pd與二維數(shù)組b建立指向關(guān)系。對二維數(shù)組b中第i(0≤i≤2)行j(0≤j≤3)列元素的訪問有①b[i][j]②pd[i][j]③*(*(b+i)+j)④*(*(pd+i)+j))四種形式。在通過鍵盤給數(shù)組b中的逐個元素格式化賦值時,訪問的是它們的地址;對數(shù)組b中第i(0≤i≤2)行j(0≤j≤3)列元素的地址的表示有*(b+i)+j、b[i] +j、*(pd+i)+j、pd[i]+j三種表示形式。pd和b都是二級指針,都是按列移動,它們是等價的,如果pd始終指向數(shù)組b的首首行,則在數(shù)組名b出現(xiàn)的地方都能用用pd替換,它們是等價的。
通過上述對指針變量與數(shù)組關(guān)系的分析,其結(jié)果可以歸納如下:當(dāng)一級指針變量指向一維數(shù)組首元素后,只要不改變指針變量的值,所有要一維數(shù)組名出現(xiàn)的地方都能用指針變量名替換,它們間是等價的。當(dāng)一級指針變量指向二維數(shù)組的首元素后,由于級別的不同(一個列移動,一個是行移動),這就決定了在數(shù)組名出現(xiàn)的地方如果用一維指針來替換必須進(jìn)行一定的處理,它們間是不等價的。二級指針變量與二維數(shù)組名都是二級指針。它們之間能否建立關(guān)系的首要條件要看二級指針變量能否確定它所指向二維數(shù)組的列寬,次要條件是二級指針變量所指的一維數(shù)組的元素個數(shù)與二維數(shù)組的列寬是否相等,兩者缺一不可。
[1]崔武子.C++語言程序設(shè)計[M].北京:清華大學(xué)出版社,2008-02.
[2]向華.C++語言程序設(shè)計[M].北京:清華大學(xué)出版社,2008-06.
Analysis on Relationship between Pointer V ariables and Arrays in C++Language
HUGNG Guo-jun
(Huanggang Polytechnic College,Huanggang438002Hubei)
The relationship between the pointer variable and array is very closely related in C++language.It is the difficult point to master the relationship between the variables and arraysfor learning C++language well,which is also key point.In order to clarify the importance and difficulties in teaching,the author analyzed the relationship between the pointer variables of different levels and different dimensions of the arrays.
Pointer variables;Address;Array
TP314
A
1672-1047(2010)03-0009-02
10.3969/j.issn.1672-1047.2010.03.03
[責(zé)任編校:郭杏芳]
2010-4-20
黃國軍(1972-),男,碩士,講師。hgjcpp@hgpu.edu.cn