當前位置:才華齋>計算機>C語言>

多維陣列的指標變數

C語言 閱讀(3.02W)

導語:我們知道陣列名就是指標常量,那麼多維陣列的指標變數如何運作呢?下面讓我們瞭解一下多維陣列的的指標變數。

多維陣列的指標變數

把二維陣列a 分解為一維陣列a[0],a[1],a[2]之後,設p為指向二維陣列的指標變數。可定義為: int (*p)[4] 它表示p是一個指標變數,它指向二維陣列a 或指向第一個一維陣列a[0],其值等於a,a[0],或&a[0][0]等。而p+i則指向一維陣列a[i]。從前面的分析可得出*(p+i)+j是二維陣列i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值。

二維陣列指標變數說明的一般形式為: 型別說明符 (*指標變數名)[長度] 其中“型別說明符”為所指陣列的`資料型別。“*”表示其後的變數是指標型別。 “長度”表示二維陣列分解為多個一維陣列時, 一維陣列的長度,也就是二維陣列的列數。應注意“(*指標變數名)”兩邊的括號不可少,如缺少括號則表示是指標陣列(本章後面介紹),意義就完全不同了。

[Explain]main(){

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

int(*p)[4];

int i,j;

p=a;

for(i=0;i<3;i++)

for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));

}

'Expain字串指標變數的說明和使用字串指標變數的定義說明與指向字元變數的指標變數說明是相同的。只能按對指標變數的賦值不同來區別。 對指向字元變數的指標變數應賦予該字元變數的地址。如: char c,*p=&c;表示p是一個指向字元變數c的指標變數。而: char *s="C Language";則表示s是一個指向字串的指標變數。把字串的首地址賦予s。

請看下面一例。

main(){

char *ps;

ps="C Language";

printf("%s",ps);

}

執行結果為:

C Language

上例中,首先定義ps是一個字元指標變數, 然後把字串的首地址賦予ps(應寫出整個字串,以便編譯系統把該串裝入連續的一塊記憶體單元),並把首地址送入ps。程式中的: char *ps;ps="C Language";等效於: char *ps="C Language";輸出字串中n個字元後的所有字元。

main(){

char *ps="this is a book";

int n=10;

ps=ps+n;

printf("%s/n",ps);

}

執行結果為:

book 在程式中對ps初始化時,即把字串首地址賦予ps,當ps= ps+10之後,ps指向字元“b”,因此輸出為"book"。

main(){

char st[20],*ps;

int i;

printf("input a string:/n");

ps=st;

scanf("%s",ps);

for(i=0;ps[i]!='/0';i++)

if(ps[i]=='k'){

printf("there is a 'k' in the string/n");

break;

}

if(ps[i]=='/0') printf("There is no 'k' in the string/n");

}

本例是在輸入的字串中查詢有無‘k’字元。 下面這個例子是將指標變數指向一個格式字串,用在printf函式中,用於輸出二維陣列的各種地址表示的值。但在printf語句中用指標變數PF代替了格式串。 這也是程式中常用的方法。

main(){

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

char *PF;

PF="%d,%d,%d,%d,%d/n";

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));

}

在下例是講解,把字串指標作為函式引數的使用。要求把一個字串的內容複製到另一個字串中,並且不能使用strcpy函式。函式cprstr的形參為兩個字元指標變數。pss指向源字串,pds指向目標字串。表示式:

(*pds=*pss)!=`/0'

cpystr(char *pss,char *pds){

while((*pds=*pss)!='/0'){

pds++;

pss++; }

}

main(){

char *pa="CHINA",b[10],*pb;

pb=b;

cpystr(pa,pb);

printf("string a=%s/nstring b=%s/n",pa,pb);

}

在上例中,程式完成了兩項工作:一是把pss指向的源字元複製到pds所指向的目標字元中,二是判斷所複製的字元是否為`/0',若是則表明源字串結束,不再迴圈。否則,pds和pss都加1,指向下一字元。在主函式中,以指標變數pa,pb為實參,分別取得確定值後呼叫cprstr函式。由於採用的指標變數pa和pss,pb和pds均指向同一字串,因此在主函式和cprstr函式中均可使用這些字串。也可以把cprstr函式簡化為以下形式:

cprstr(char *pss,char*pds)

{while ((*pds++=*pss++)!=`/0');}

即把指標的移動和賦值合併在一個語句中。 進一步分析還可發現`/0'的ASCⅡ碼為0,對於while語句只看表示式的值為非0就迴圈,為0則結束迴圈,因此也可省去“!=`/0'”這一判斷部分,而寫為以下形式:

cprstr (char *pss,char *pds)

{while (*pdss++=*pss++);}

表示式的意義可解釋為,源字元向目標字元賦值, 移動指標,若所賦值為非0則迴圈,否則結束迴圈。這樣使程式更加簡潔。簡化後的程式如下所示。

cpystr(char *pss,char *pds){

while(*pds++=*pss++);

}

main(){

char *pa="CHINA",b[10],*pb;

pb=b;

cpystr(pa,pb);

printf("string a=%s/nstring b=%s/n",pa,pb);

}