⼆维字符数组的定义、赋值和使⽤
⼆维字符数组⼀般⽤于存储和处理多个字符串,⼆维字符数组中的每⼀⾏均可存储表⽰⼀个字符串。
⼆维字符数组的定义
⼆维字符数组的定义格式为:
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 的逻辑结构如下所⽰:
01234567 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]。
故该数组各元素中的值如下所⽰。
01234
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
注意,本例题仅是为了说明数组的逻辑结构和存储结构的区别,程序设计时,应避免这种情况。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。