c-style的二维数组

C-style的数组要初始化需要有固定的长度

char FILTER_STATUS_WORD[4][8] = {"NOS","WARM","SHARP","BACK"};
  display.drawStr(166,42, INPUT_STATUS_WORD[__INPUT_STATUS]);

然后A[]就可以输出这个数组的字符 相当于"ABCDEF"

一个英文字符需要一个char  但是后面还需要一个EOL,也就是结束符/0

字符串 "Pear" 的长度为 4,该字符串的 5 个字符(包含 '\0')分别从 c[2] 行的首元素 c[2][0] 开始存放,到 c[2][4]。

或者类似

const char* string = "ABC";

 

如果只是开辟空数组可以只用memset/memset_s初始化每个元素为0/1

int arr3[10][10];
memset(arr3, 0, sizeof(arr3); /* 正常,arr3中的每个元素都为0 */
memset(arr3, -1, sizeof(arr3); /* 正常,arr3中的每个元素都为-1 */
memset(arr3, 2, sizeof(arr3); /* 异常,arr3中的每个元素都为异常值33686018 */

arr3[0]...[9] 

这是一个比较奇怪的初始化方式

#define ARR_LEN 100
int arr4[ARR_LEN][ARR_LEN] = { [0 ... (ARR_LEN-1)][0 ... (ARR_LEN-1)] = 10 }; /* 100*100个元素都初始化为10 */

这个是合法的

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

 

 

这个是字符

c[2][0]='B'; //把字符赋值给2行0列元素

这个是字符串

c[0][0]="A"; 

合法引用

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

单引号和双引号

'' 引起的一个字符代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。

"" 引起的字符串代表的是一个指向无名数组起始字符的指针。

此事在《C陷阱与缺陷》中亦有记载

 

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

陷阱题

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

 

  0 1 2 3 4
c[0] A P P L U
c[1] O  R A N G
c[2] P E A R /0

 

 

 

 

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

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

运行结果为:
AppleOrangPear
OrangPear
Pear

 

 

 

posted @ 2025-01-19 22:41  mcwhirr  阅读(10)  评论(0)    收藏  举报