多維陣列的指標變數

2021-05-10 12:49:44 字數 4273 閱讀 6416

原文**:http://www.programfan.com/article/showarticle.asp?id=2689

一、多維陣列位址的表示方法

設有整型二維陣列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"

main();

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

} 二、多維陣列的指標變數

把二維陣列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();

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

執行結果為:

c language

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

main()

執行結果為:

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

main()

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

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

main();

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)

}main()  

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

cprstr(char *pss,char*pds)

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

cprstr (char *pss,char *pds)

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

cpystr(char *pss,char *pds)

main()

使用字串指標變數與字元陣列的區別

用字元陣列和字元指標變數都可實現字串的儲存和運算。 但是兩者是有區別的。在使用時應注意以下幾個問題:

1. 字串指標變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在以該首位址為首的一塊連續的記憶體空間中並以『/0』作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。

2. 對字元陣列作初始化賦值,必須採用外部型別或靜態型別,如: static char st=;而對字串指標變數則無此限制,如: char *ps="c language";

3. 對字串指標方式 char *ps="c language";可以寫為: char *ps; ps="c language";而對陣列方式:

static char st=;

不能寫為:

char st[20];st=;

而只能對字元陣列的各元素逐個賦值。

從以上幾點可以看出字串指標變數與字元陣列在使用時的區別,同時也可看出使用指標變數更加方便。前面說過,當乙個指標變數在未取得確定位址前使用是危險的,容易引起錯誤。但是對指標變數直接賦值是可以的。因為c系統對指標變數賦值時要給以確定的位址。因此,

char *ps="c langage";

或者char *ps;

ps="c language";

都是合法的。

指標 多維陣列 陣列指標 指標陣列

之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式 include int main int parray null parray iarray printf array 0...

多維陣列和多維指標

指向指標的指標 指標變數在記憶體中會占用一定的空間 可以定義指標來儲存指標變數的位址 int pp本質上還是指標,只是兩個 告訴你這是乙個指向指標的指標char p null char p2 p p2 給p賦值沒有問題,但怎麼使用p 呢?這就需要我們前面多次提到的鑰匙 第一步 根據 p 這個變數,取...

多維陣列 和 多維指標

指標變數在記憶體中會占用一定的空間。可以定義指標來儲存指標變數的位址值。舉例 舉例說明,多級指標的使用,重置動態空間大小 include include int reset char p,int size,int new size else return ret int main return 0 ...