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
浙公网安备 33010602011771号