二維字元陣列的定義,初始化及參照,C語言二位字元陣列詳解

2020-07-16 10:04:22
二維字元陣列一般用於儲存和處理多個字串,二維字元陣列中的每一行均可儲存表示一個字串。

二維字元陣列的定義

二維字元陣列的定義格式為:

char 陣列名[第一維大小][第二維大小];

如:
char c[3][10]; //定義了一個3行10列的二維字元陣列c
由於該二維陣列的每一行 c[0]、c[1]、c[2] 均是含有 10 個元素的一維字元陣列,即二維陣列的每一行均可表示一個字串。

二維字元陣列的初始化

通常情況下,二維陣列的每一行分別使用一個字串進行初始化。 例如:
char c[3][8]={{"apple"},{"orange"},{"banana"}};
等價於:
char c[3][8]={"apple","orange","banana"};
以上兩條初始化語句中,二維陣列的第一維大小均可省略。陣列 c 的邏輯結構如下所示:

  0 1 2 3 4 5 6 7
c[0] a p p l e
c[1] o r a n g e
c[2] b a n a n a

二維字元教組的參照

可以使用行下標和列下標參照二維字元陣列中的每個元素(字元),例如:
char c[][10]={"apple","orange","banana"};

以下均是對二維字元陣列元素的合法參照:
printf ("%c",c[1][4]); //輸出1行4列元素'g'字元
scanf ("%c",&c[2][3]); //輸入一個字元到2行3列元素中
c[2][0]='B'; //把字元賦值給2行0列元素
printf ("%s",c[1]); //c[1]為第2行的陣列名(首元素地址),輸出 orange
scanf ("%s",c[2]); //輸入字串到c[2]行,從c[2]行的首地址開始存放

以下是對二維字元陣列元素的非法參照:

c[0][0]="A"; //行、列下標表示的為字元型元素,不能使用字串賦值
printf ("%c",c[2]); //c[2]為第3行的首地址,不是字元元素,故不能用%c


【例 1】 分析以下程式,輸出其執行結果。
#include<stdio.h>
int main (void)
{
    char c[3][5] = {"Apple","Orange","Pear"};
    int i;
    for(i=0;i<3;i++)
        printf ("%sn",c[i]);
    return 0;
}
分析:本題主要考查二維陣列的邏輯結構和儲存結構的區別。二維陣列在邏輯上是分行分列的,但其儲存結構卻是連續的。

字串 "Apple" 的長度為 5,加上結束符 "" 共 6 個字元,前 5 個字元分別從 c[0] 行的首元素 c[0][0] 開始存放,到 c[0][4],第 6 個字元 '' 只能儲存到 c[1] 行的首元素 c[1][0]。

字串 "Orange" 的長度為 6,該字串的前 5 個字元分別從 c[1] 行的首元素 c[1][0] 開始存放,到 c[1][4],第 6 個字元及結束符 '' 順序存到 c[2][0] 和 c[2][1]。

字串 "Pear" 的長度為 4,該字串的 5 個字元(包含 '')分別從 c[2] 行的首元素 c[2][0] 開始存放,到 c[2][4]。

故該陣列各元素中的值如下所示。

  0 1 2 3 4
c[0] A p p l e
c[1] O r a n g
c[2] P e a r

由上述可以發現,該二維字元陣列空間僅有一個字串結束符 '',而 printf("%s",地址); 的功能是輸出一個字串,該串是從輸出列表中的地址開始,到第一次遇到為止之間的字元組成的串。

c[0] 為 c[0] 行的首地址,即 &c[0][0]。
printf ("%sn",c[0]); //輸出AppleOrangPear
printf ("%sn",c[1]); //輸出OrangPear
printf ("%sn",c[2]); // Pear
執行結果為:
AppleOrangPear
OrangPear
Pear

注意,本例題僅是為了說明陣列的邏輯結構和儲存結構的區別,程式設計時,應避免這種情況。