張小軍, 張 晶
(河南教育學(xué)院 信息技術(shù)系,河南 鄭州 450046)
辨析指針數(shù)組與數(shù)組指針
張小軍, 張 晶
(河南教育學(xué)院 信息技術(shù)系,河南 鄭州 450046)
在C語言代碼的編寫過程中,指針數(shù)組與數(shù)組指針是經(jīng)常用到的數(shù)據(jù)類型,其形式相近而意義迥然.正確理解這兩個概念是使用C語言寫好代碼的前提.通過實(shí)例比較,闡述指針數(shù)組與數(shù)組指針的差異.
指針;指針數(shù)組;數(shù)組指針;地址;內(nèi)存
由于C語言具有高級程序設(shè)計語言的特點(diǎn),又具有匯編語言的特點(diǎn),所以它不但可以作為系統(tǒng)設(shè)計語言用來編寫系統(tǒng)軟件,應(yīng)用于單片機(jī)以及嵌入式系統(tǒng)開發(fā)等,還可以作為應(yīng)用程序設(shè)計語言,編寫不依賴計算機(jī)硬件的應(yīng)用程序,處理海量的數(shù)據(jù),被廣泛應(yīng)用于各類信息的處理. 而指針數(shù)組與數(shù)組指針則是C語言中的重要數(shù)據(jù)類型,經(jīng)常被使用.因?yàn)樗鼈冃问较嘟?,很容易被混?下面從指針的概念開始,辨析指針數(shù)組與數(shù)組指針這兩個概念,繼而給出實(shí)例闡述這兩個概念的區(qū)別[1].
1.1 指針
指針的本質(zhì)是一個地址,表現(xiàn)為一個十六進(jìn)制的數(shù)據(jù).在內(nèi)存中,它占據(jù)4個字節(jié)的存儲空間,是變量在內(nèi)存當(dāng)中的實(shí)際地址.一般通過指針位置的變化實(shí)現(xiàn)對指針?biāo)赶蚩臻g的內(nèi)容操作,示例中變量和指針內(nèi)存空間示意圖如圖1.
圖1 變量a和指針p的內(nèi)存地址
1.2 指針數(shù)組
指針數(shù)組(pointers of arrays),即用于存儲指針的數(shù)組,也就是數(shù)組元素都是指針.若數(shù)組中的每一個元素都是指針,則該數(shù)組被稱為指針數(shù)組.譬如,若有3個元素的數(shù)組,每個元素都是指向整型變量的指針,那么其類型定義的形式為int *p[2].換句話說,就是數(shù)組p中的元素都是int型的指針.一般情況下,我們使用*p[2]的形式,但有時候也會看到*(p[i])這種表示形式,這兩者本質(zhì)是一樣.因?yàn)?,在C語言的語法定義中,多個運(yùn)算符之間是有優(yōu)先級規(guī)定的.這里的運(yùn)算符“[]”優(yōu)先級高于運(yùn)算符“*”.
int *p[3]; //是一個指針數(shù)組,定義了3個指針,分別為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ù)組的一個指針.變量的定義形式:
數(shù)據(jù)類型(*變量名)[元素個數(shù)];
例如:int (*p);
由于“()”優(yōu)先級高,首先說明p是一個指針,指向一個整型的一維數(shù)組,這個一維數(shù)組的長度是4,也可以說是p的步長.也就是說執(zhí)行p+1時,p要跨過4個整型數(shù)據(jù)的長度[2].
其內(nèi)存空間示意圖如圖3.
圖3 數(shù)組指針在內(nèi)存中地址
2.1 代碼示例
#include
main()
{
int i; //申明一個變量i
int *p[6]; //申明一個指針數(shù)組*p[6]
int (*q)[6]; //申明一個數(shù)組指針(*q)[6]
int s[6]={1,7,3,4,8,2}; //創(chuàng)建一個數(shù)組s[6]并賦值
q=s; //將數(shù)組s[6]賦值給數(shù)組指針(*q)[6]
for(i=0;i<6;i++) //創(chuàng)建一個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ù)組的指針變量
定義方法:(*指針變量名)[長度],即(*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ù)組中的每一個元素都是指針.因?yàn)橹羔樀谋举|(zhì)是地址,所以,不管是哪種類型的指針,只要是類型匹配地址就可以存放.就像指針變量可以指向某個基本類型的變量一樣,也可以定義指針變量來指向數(shù)組與數(shù)組元素.數(shù)組各個元素在內(nèi)存中的存放是連續(xù)的,所以用指向數(shù)組或數(shù)組元素的指針變量來使用數(shù)組,令代碼的編寫與執(zhí)行效率更高.
[1] 韓曉新.C語言中的指針教學(xué)[J].常州教育學(xué)院學(xué)報(綜合版),2001,15(9):21.
[2] 宋靈香,趙靜,劉運(yùn)奇.分析指針數(shù)組與數(shù)組指針的區(qū)別和應(yīng)用[J].甘肅高師學(xué)報,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)科研項目計劃(16A520008)
張小軍(1980—),男,河南鄭州人,河南教育學(xué)院信息技術(shù)系副教授,主要研究方向:計算機(jī)應(yīng)用.
10.3969/j.issn.1007-0834.2017.01.016
TP312
A
1007-0834(2017)01-0068-04