天天看點

C語言教程第六章:指針(3)

數組指針變量的說明');和運用,  指向數組的指針變量稱為數組指針變量。在駁斥沖突數組指針變量的說明');和運用之前,我們先懂得幾個關連。,一個數組是由延續的一塊記憶體機關構成的。數組名就是這塊延續内

數組指針變量的說明');和運用

  指向數組的指針變量稱為數組指針變量。 在駁斥沖突數組指針變量的說明');和運用之前,我們先懂得幾個關連。

一個數組是由延續的一塊記憶體機關構成的。 數組名就是這塊延續記憶體機關的首地點。一個數組也是由各個數組元素(下标變量) 構成的。每個數組元素按其圭臬規範不合占有幾個延續的記憶體機關。 一個數組元素的首地點也是指它所占有的幾個記憶體機關的首地點。 一個指針變量既可以指向一個數組,也可以指向一個數組元素, 可把數組名或第一個元素的地點賦予它。如要使指針變量指向第i号元素可以把i元素的首地點賦予它或把數組名加i賦予它。

  設有實數組a,指向a的指針變量為pa,從圖6.3中我們可以看出有以下關連:

pa,a,&a[0]均指向不合機關,它們是數組a的首地點,也是0 号元素a[0]的首地點。pa 1,a 1,&a[1]均指向1号元素a[1]。類推可知a i,a i,&a[i]

指向i号元素a[i]。應該說明');的是pa是變量,而a,&a[i]都是常量。在程式設計時應予以看重。

main(){

int a[5],i;

for(i=0;i<5;i ){

a[i]=i;

printf("a[%d]=%d\n",i,a[i]);

}

printf("\n");

主函數

界說一個整型數組和一個整型變量

循環語句

給數組指派

列印每一個數組的值

......

輸入換行

數組指針變量說明');的通俗情勢為:

圭臬規範說明');符 * 指針變量名

  其中圭臬規範說明');符闡揚剖析所指數組的圭臬規範。 從通俗情勢可以看出指向數組的指針變量和指向通俗變量的指針變量的說明');是雷同的。

引入指針變量後,就可以用兩種方式來碰面數組元素了。

  第一種方式為下标法,即用a[i]情勢碰面數組元素。 在第四章中先容數組時都是采取這種方式。

  第二種方式為指針法,即采取*(pa i)情勢,用直接碰面的方式來碰面數組元素。

int a[5],i,*pa;

pa=a;

*pa=i;

pa ;

printf("a[%d]=%d\n",i,*pa);

界說整型數組和指針

把指針pa指向數組a

循環

把變量i的值賦給由指針pa指向的a[]的數組機關

把指針pa指向a[]的下一個機關

指針pa從頭取得數組a的首地點

用數組方式輸入數組a中的全數元素

......

上面,另舉一例,該例與上例本意雷同,然則完成方式不合。

int a[5],i,*pa=a;

for(i=0;i<5;){

printf("a[%d]=%d\n",i ,*pa );

界說整型數組和指針,并使指針指向數組a

用指針輸入數組a中的全數元素,同時指針pa指向a[]的下一個機關

數組名和數組指針變量作函數參數

  在第五章中已經先容過用數組名作函數的實參和形參的成績。在進修指針變量之後就更随意草率懂得這個成績了。 數組名就是數組的首地點,實參向形參傳送數組名理想上就是傳送數組的地點, 形參取得該地點後也指向不合數組。 這就好象不合件物品有兩個互相不合的稱号一樣。異樣,指針變量的值也是地點, 數組指針變量的值即為數組的首地點,雖然也可作為函數的參數運用。

float aver(float *pa);

float sco[5],av,*sp;

int i;

sp=sco;

printf("\ninput 5 scores:\n");

for(i=0;i<5;i ) scanf("%f",&sco[i]);

av=aver(sp);

printf("average score is %5.2f",av);

float aver(float *pa)

{

float av,s=0;

for(i=0;i<5;i ) s=s *pa ;

av=s/5;

return av;

指向多元數組的指針變量

本大節以二維數組為例先容多元數組的指針變量。

一、多元數組地點的闡揚剖析方式

設有整型二維數組a[3][4]如下:

0 1 2 3

4 5 6 7

8 9 10 11

  設數組a的首地點為1000,各下标變量的首地點及其值如圖所示。在第四章中先容過, C語言許可把一個二維數組分解為多個一維數組來處理責罰。是以數組a可分解為三個一維數組,即a[0],a[1],a[2]。每一個一維數組又含有四個元素。例如a[0]數組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。 數組及數組元素的地點闡揚剖析如下:a是二維數組名,也是二維數組0行的首地點,等于1000。a[0]是第一個一維數組的數組名和首地點,是以也為1000。*(a 0)或*a是與a[0]等效的, 它闡揚剖析一維數組a[0]0 号元素的首地點。 也為1000。&a[0][0]是二維數組a的0行0列元素首地點,異樣是1000。是以,a,a[0],*(a 0),*a,&a[0][0]是相等的。同理,a 1是二維數組1行的首地點,等于1008。a[1]是第二個一維數組的數組名和首地點,是以也為1008。 &a[1][0]是二維數組a的1行0列元素地點,也是1008。是以a 1,a[1],*(a 1),&a[1][0]是一緻的。 由此可得出:a i,a[i],*(a i),&a[i][0]是一緻的。 其它,&a[i]和a[i]也是一緻的。因為在二維數組中不克不及把&a[i]懂得為元素a[i]的地點,不存在元素a[i]。

  C語言劃定,它是一種地點較勁争論方式,闡揚剖析數組a第i行首地點。由此,我們得出:a[i],&a[i],*(a i)和a i也都是一緻的。别的,a[0]也

可以看成是a[0] 0是一維數組a[0]的0号元素的首地點, 而a[0] 1則是a[0]的1号元素首地點,由此可得出a[i] j則是一維數組a[i]的j号元素首地點,它等于&a[i][j]。由a[i]=*(a i)得a[i] j=*(a i) j,因為*(a i) j是二維數組a的i行j列元素的首地點。該元素的值等于*(*(a i) j)。

[Explain]#define PF "%d,%d,%d,%d,%d,\n"

static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

printf(PF,a,*a,a[0],&a[0],&a[0][0]);

printf(PF,a 1,*(a 1),a[1],&a[1],&a[1][0]);

printf(PF,a 2,*(a 2),a[2],&a[2],&a[2][0]);

printf("%d,%d\n",a[1] 1,*(a 1) 1);

printf("%d,%d\n",*(a[1] 1),*(*(a 1) 1));

版權聲明:

原創作品,許可轉載,轉載時請務必以超連結情勢标明文章 原始因由 、作者資訊和本聲明。不然将清查執法責任。

繼續閱讀