二维字符数组一般用于存储和处理多个字符串,二维字符数组中的每一行均可存储表示一个字符串。

二维字符数组的定义

二维字符数组的定义格式为:

char 数组名[第一维大小][第二维大小];

如:

    1. char c[3][10]; //定义了一个3行10列的二维字符数组c

    由于该二维数组的每一行 c[0]、c[1]、c[2] 均是含有 10 个元素的一维字符数组,即二维数组的每一行均可表示一个字符串。

    二维字符数组的初始化

    通常情况下,二维数组的每一行分别使用一个字符串进行初始化。 例如:

      1. char c[3][8]={{"apple"},{"orange"},{"banana"}};

      等价于:

        1. char c[3][8]={"apple","orange","banana"};

        以上两条初始化语句中,二维数组的第一维大小均可省略。数组 c 的逻辑结构如下所示:

         

        0

        1

        2

        3

        4

        5

        6

        7

        c[0]

        a

        p

        p

        l

        e

        \0

        \0

        \0

        c[1]

        o

        r

        a

        n

        g

        e

        \0

        \0

        c[2]

        b

        a

        n

        a

        n

        a

        \0

        \0

        二维字符教组的引用

        可以使用行下标和列下标引用二维字符数组中的每个元素(字符),例如:

          1. char c[][10]={"apple","orange","banana"};

          以下均是对二维字符数组元素的合法引用:

            1. printf ("%c",c[1][4]); //输出1行4列元素'g'字符
            2. scanf ("%c",&c[2][3]); //输入一个字符到2行3列元素中
            3. c[2][0]='B'; //把字符赋值给2行0列元素
            4. printf ("%s",c[1]); //c[1]为第2行的数组名(首元素地址),输出 orange
            5. scanf ("%s",c[2]); //输入字符串到c[2]行,从c[2]行的首地址开始存放

            以下是对二维字符数组元素的非法引用:

            c[0][0]="A"; //行、列下标表示的为字符型元素,不能使用字符串赋值
            printf ("%c",c[2]); //c[2]为第3行的首地址,不是字符元素,故不能用%c
            【例 1】 分析以下程序,输出其运行结果。

              1. #include<stdio.h>
              2. int main (void)
              3. {
              
              4. char c[3][5] = {"Apple","Orange","Pear"};
              5. int i;
              6. for(i=0;i<3;i++)
              7. printf ("%s\n",c[i]);
              8. return 0;
              9. }

              分析:本题主要考查二维数组的逻辑结构和存储结构的区别。二维数组在逻辑上是分行分列的,但其存储结构却是连续的。

              字符串 "Apple" 的长度为 5,加上结束符 "\0" 共 6 个字符,前 5 个字符分别从 c[0] 行的首元素 c[0][0] 开始存放,到 c[0][4],第 6 个字符 '\0' 只能保存到 c[1] 行的首元素 c[1][0]。

              字符串 "Orange" 的长度为 6,该字符串的前 5 个字符分别从 c[1] 行的首元素 c[1][0] 开始存放,到 c[1][4],第 6 个字符及结束符 '\0' 顺序存到 c[2][0] 和 c[2][1]。

              字符串 "Pear" 的长度为 4,该字符串的 5 个字符(包含 '\0')分别从 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

              \0

              由上述可以发现,该二维字符数组空间仅有一个字符串结束符 '\0',而 printf("%s",地址); 的功能是输出一个字符串,该串是从输出列表中的地址开始,到第一次遇到为止之间的字符组成的串。
              c[0] 为 c[0] 行的首地址,即 &c[0][0]。

                1. printf ("%s\n",c[0]); //输出AppleOrangPear
                2. printf ("%s\n",c[1]); //输出OrangPear
                3. printf ("%s\n",c[2]); // Pear

                运行结果为:

                AppleOrangPear
                 OrangPear
                 Pear


                注意,本例题仅是为了说明数组的逻辑结构和存储结构的区别,程序设计时,应避免这种情况。