張小軍, 張 晶
(河南教育學(xué)院 信息技術(shù)系,河南 鄭州 450046)
辨析指針數(shù)組與數(shù)組指針
張小軍, 張 晶
(河南教育學(xué)院 信息技術(shù)系,河南 鄭州 450046)
在C語(yǔ)言代碼的編寫(xiě)過(guò)程中,指針數(shù)組與數(shù)組指針是經(jīng)常用到的數(shù)據(jù)類(lèi)型,其形式相近而意義迥然.正確理解這兩個(gè)概念是使用C語(yǔ)言寫(xiě)好代碼的前提.通過(guò)實(shí)例比較,闡述指針數(shù)組與數(shù)組指針的差異.
指針;指針數(shù)組;數(shù)組指針;地址;內(nèi)存
由于C語(yǔ)言具有高級(jí)程序設(shè)計(jì)語(yǔ)言的特點(diǎn),又具有匯編語(yǔ)言的特點(diǎn),所以它不但可以作為系統(tǒng)設(shè)計(jì)語(yǔ)言用來(lái)編寫(xiě)系統(tǒng)軟件,應(yīng)用于單片機(jī)以及嵌入式系統(tǒng)開(kāi)發(fā)等,還可以作為應(yīng)用程序設(shè)計(jì)語(yǔ)言,編寫(xiě)不依賴計(jì)算機(jī)硬件的應(yīng)用程序,處理海量的數(shù)據(jù),被廣泛應(yīng)用于各類(lèi)信息的處理. 而指針數(shù)組與數(shù)組指針則是C語(yǔ)言中的重要數(shù)據(jù)類(lèi)型,經(jīng)常被使用.因?yàn)樗鼈冃问较嘟?,很容易被混?下面從指針的概念開(kāi)始,辨析指針數(shù)組與數(shù)組指針這兩個(gè)概念,繼而給出實(shí)例闡述這兩個(gè)概念的區(qū)別[1].
1.1 指針
指針的本質(zhì)是一個(gè)地址,表現(xiàn)為一個(gè)十六進(jìn)制的數(shù)據(jù).在內(nèi)存中,它占據(jù)4個(gè)字節(jié)的存儲(chǔ)空間,是變量在內(nèi)存當(dāng)中的實(shí)際地址.一般通過(guò)指針位置的變化實(shí)現(xiàn)對(duì)指針?biāo)赶蚩臻g的內(nèi)容操作,示例中變量和指針內(nèi)存空間示意圖如圖1.
圖1 變量a和指針p的內(nèi)存地址
1.2 指針數(shù)組
指針數(shù)組(pointers of arrays),即用于存儲(chǔ)指針的數(shù)組,也就是數(shù)組元素都是指針.若數(shù)組中的每一個(gè)元素都是指針,則該數(shù)組被稱(chēng)為指針數(shù)組.譬如,若有3個(gè)元素的數(shù)組,每個(gè)元素都是指向整型變量的指針,那么其類(lèi)型定義的形式為int *p[2].換句話說(shuō),就是數(shù)組p中的元素都是int型的指針.一般情況下,我們使用*p[2]的形式,但有時(shí)候也會(huì)看到*(p[i])這種表示形式,這兩者本質(zhì)是一樣.因?yàn)?,在C語(yǔ)言的語(yǔ)法定義中,多個(gè)運(yùn)算符之間是有優(yōu)先級(jí)規(guī)定的.這里的運(yùn)算符“[]”優(yōu)先級(jí)高于運(yùn)算符“*”.
int *p[3]; //是一個(gè)指針數(shù)組,定義了3個(gè)指針,分別為p[0]、p[1]、p[2]
int a0=1,a1=2,a2=3;
p[0]=&a0;p[1]=&a1;p[2]=&a2;
其內(nèi)存空間示意圖如圖2.
圖2 指針數(shù)組在內(nèi)存中的地址
1.3 數(shù)組指針
數(shù)組指針(arrays of pointers),就是指向數(shù)組的一個(gè)指針.變量的定義形式:
數(shù)據(jù)類(lèi)型(*變量名)[元素個(gè)數(shù)];
例如:int (*p);
由于“()”優(yōu)先級(jí)高,首先說(shuō)明p是一個(gè)指針,指向一個(gè)整型的一維數(shù)組,這個(gè)一維數(shù)組的長(zhǎng)度是4,也可以說(shuō)是p的步長(zhǎng).也就是說(shuō)執(zhí)行p+1時(shí),p要跨過(guò)4個(gè)整型數(shù)據(jù)的長(zhǎng)度[2].
其內(nèi)存空間示意圖如圖3.
圖3 數(shù)組指針在內(nèi)存中地址
2.1 代碼示例
#include
main()
{
int i; //申明一個(gè)變量i
int *p[6]; //申明一個(gè)指針數(shù)組*p[6]
int (*q)[6]; //申明一個(gè)數(shù)組指針(*q)[6]
int s[6]={1,7,3,4,8,2}; //創(chuàng)建一個(gè)數(shù)組s[6]并賦值
q=s; //將數(shù)組s[6]賦值給數(shù)組指針(*q)[6]
for(i=0;i<6;i++) //創(chuàng)建一個(gè)for循環(huán),將數(shù)組s[6]循環(huán)
*p[i]=s[i]; //賦值給指針數(shù)組*p[6]
printf("*p[3]=%d (*q)[3]=%d s[3]=%d",*p[3],(*q)[3],s[3]);
//輸出*p[3],(*q)[3],s[3]
getch();
}
輸出:
*p[3]=4
(*q)[3]=4
s[3]=4
2.2 指向一維數(shù)組的指針變量
定義方法:*指針變量名,即*p.
#include
main()
{
int a[5]={1,2,3,5,7};
int *p=a, i ;
for(i=0,i<5,i++)
printf("%4d",p[i]);
getch();
}
輸出:1 2 3 5 7
2.3 指向二維數(shù)組的指針變量
定義方法:(*指針變量名)[長(zhǎng)度],即(*p)[n].
main()
{
Int i,j,m,n,max;
Int a[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12};
m=0;n=0;
max=**a;
for(i=0;i<4;i++)
{
printf(" ");
for(j=0;j<4;j++)
{
printf("%5d",*(*(a+i)+j));
if(max<*(*(a+i)+j))
{
max=*(*(a+i)+j));
m=i;i=j ;
}
}
}
printf(" max is :a[%2d][%2d]=%5d",m,n,max);
getch();
}
輸出:
1 2 3 4
5 6 7 8
9 10 11 12
max is :a[2][3]=12
數(shù)組指針是指向數(shù)組的,而指針數(shù)組中的每一個(gè)元素都是指針.因?yàn)橹羔樀谋举|(zhì)是地址,所以,不管是哪種類(lèi)型的指針,只要是類(lèi)型匹配地址就可以存放.就像指針變量可以指向某個(gè)基本類(lèi)型的變量一樣,也可以定義指針變量來(lái)指向數(shù)組與數(shù)組元素.數(shù)組各個(gè)元素在內(nèi)存中的存放是連續(xù)的,所以用指向數(shù)組或數(shù)組元素的指針變量來(lái)使用數(shù)組,令代碼的編寫(xiě)與執(zhí)行效率更高.
[1] 韓曉新.C語(yǔ)言中的指針教學(xué)[J].常州教育學(xué)院學(xué)報(bào)(綜合版),2001,15(9):21.
[2] 宋靈香,趙靜,劉運(yùn)奇.分析指針數(shù)組與數(shù)組指針的區(qū)別和應(yīng)用[J].甘肅高師學(xué)報(bào),2012,17(2):51-52.
Differentiate the Array of Pointers and Pointer of Arrays
ZHANG Xiaojun, ZHANG Jing
(DepartmentofInformationTechnology,HenanInstituteofEducation,Zhengzhou450046,China)
In the coding process of C language, arrays of pointers and pointers of arrays are freequently used data types. The form and meaning of them are very similar. A correct understanding of these two concepts is the premise of using C language to write code. Based on examples, expounds the difference between arrays of pointers and pointers of arrays.
pointers; array of pointers; pointer of array; address; memory
2016-10-27
河南省高等學(xué)校重點(diǎn)科研項(xiàng)目計(jì)劃(16A520008)
張小軍(1980—),男,河南鄭州人,河南教育學(xué)院信息技術(shù)系副教授,主要研究方向:計(jì)算機(jī)應(yīng)用.
10.3969/j.issn.1007-0834.2017.01.016
TP312
A
1007-0834(2017)01-0068-04