#include <stdio.h>
int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
printf("buf[0] = %c\n",buf[0]);
printf("buf[0] = %d\n",buf[0]);
printf("buf[0] = %p\n",buf[0]);
printf("buf[0] = %s\n",buf[0]);
return 0;
}
编译后:
printf("buf[0] = %c\n",buf[0]);出现警告 format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’
printf("buf[0] = %d\n",buf[0]);出现警告 format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’
执行:
buf[0] = V
buf[0] = -1080815274
buf[0] = 0xbf941156
buf[0] = abcdefghij��
结论:这样定义一个二维数组,buf[0]是 char*类型而不是char类型
但是printf("buf[0] = %s\n",buf[0]); 打印出来的内容和预期的不一样,预期buf[0] = abcde
int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char *p1 = buf[0];
char *p2 = buf[0][0];
char p3 = buf[0][0];
char **p4 = buf;
return 0;
}
编译执行出现的警告:
test_array.c:34:13: warning: initialization makes pointer from integer without a cast [enabled by default]
char *p2 = buf[0][0];
test_array.c:36:14: warning: initialization from incompatible pointer type [enabled by default]
char **p4 = buf;
分析:
33 行和35行没有警告 34 行有警告
恰恰说明了buf[0]是 char*类型而buf[0][0]是char类型
但是buf却不是char ** 类型,于是我们再做测试
int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char *p5[] = buf;
char *p6[5] = buf;
char (*p7)[] = buf;
char (*p8)[5] = buf;
return 0;
}
编译后:
test_array.c:57:2: error: invalid initializer
char *p5[] = buf;
^
test_array.c:58:2: error: invalid initializer
char *p6[5] = buf;
再做测试:
int main()
{
char buf[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char (*p7)[] = buf;
char (*p8)[5] = buf;
char (*p9)[2] = buf;
char (*p10)[10] = buf;
return 0;
}
编译后:
test_array.c:80:18: warning: initialization from incompatible pointer type [enabled by default]
char (*p9)[2] = buf;
^
test_array.c:81:20: warning: initialization from incompatible pointer type [enabled by default]
char (*p10)[10] = buf;
说明buf的类型为 数组指针 并且可以写成 char (*)[] char (*)[5]
最后来解决 buf[0] = abcdefghij�� 这个问题
int main()
{
char buf0[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char buf1[2][5] = {{'a','b','c','d','e'},{'f','g','h','i','j'}};
char buf2[2][5] = {"abcd","fghi"};
char buf3[2][5] = {"abcde","fghij"};
char buf4[2][5] = {"abcde1","fghij"};
return 0;
}
编译后:
test_array.c:105:2: warning: initializer-string for array of chars is too long [enabled by default]
char buf4[2][5] = {"abcde1","fghij"};
^
test_array.c:105:2: warning: (near initialization for ‘buf4[0]’) [enabled by default]
分析: buf4报错可以理解,但是buf3为什么不抱错 这里不需要考虑 \0吗
再测试:
int main()
{
char buf0[2][5] = {'a','b','c','d','e','f','g','h','i','j'};
char buf1[2][5] = {{'a','b','c','d','e'},{'f','g','h','i','j'}};
char buf2[2][5] = {"abcd","fghi"};
char buf3[2][5] = {"abcde","fghij"};
printf("buf0[0] = %s\n",buf0[0]);
printf("buf1[0] = %s\n",buf1[0]);
printf("buf2[0] = %s\n",buf2[0]);
printf("buf3[0] = %s\n",buf3[0]);
return 0;
}
编译完全可以通过,没有任何警告。
buf0[0] = abcdefghijabcdefghijabcd
buf1[0] = abcdefghijabcd
buf2[0] = abcd
buf3[0] = abcdefghij �
分析:
从上面结果可以看出 char buf3[2][5] = {"abcde","fghij"}; 这样虽然在编译时没有错误,但是执行的结果却不是预期的
所以应该也是不行的。下面对 buf2[0] 再做下确认。
int main()
{
char buf2[2][5] = {"abcd","fghi"};
printf("buf2[0] = %s\n",buf2[0]);
printf("buf2[1] = %s\n",buf2[1]);
return 0;
}
编译执行得到结果:
buf2[0] = abcd
buf2[1] = fghi
这个和预期的完全一样
最后再测试这样一个问题,就是二维数组哪一纬不是必须的,依稀记得以前书本中有这样的事情:
int main()
{
char buf1[2][];
char buf2[][5];
return 0;
}
编译后:
test_array.c: In function ‘main’:
test_array.c:164:7: error: array type has incomplete element type
char buf1[2][];
^
test_array.c:165:7: error: array size missing in ‘buf2’
char buf2[][5];
定义并初始化,再做测试:
int main()
{
char buf1[2][] = {"abcd","fghi"};
char buf2[][5] = {"abcd","fghi"};
return 0;
}
编译后:
test_array.c:182:7: error: array type has incomplete element type
char buf1[2][] = {"abcd","fghi"};
分析:char buf2[][5] = {"abcd","fghi"}; 在定义时并进行初始化,第一维可以省略
然后我们再测试这样一个问题:
int main()
{
char buf2[][5] = {
"a",
"ab",
"abc"
};
printf("buf2[0] len = %d\n",sizeof(buf2[0]));
printf("buf2[1] len = %d\n",sizeof(buf2[1]));
printf("buf2[2] len = %d\n",sizeof(buf2[2]));
return 0;
}
编译运行结果:
buf2[0] len = 5
buf2[1] len = 5
buf2[2] len = 5
分析:这恰恰也说明了 char buf2[][5] = {"abcd","fghi"}; 第一维不用定义的合理性
到这里二维数组差不多就总结完成了。
总结:
1、二维数组在定义时如果进行初始化,则第一维可以不用给出具体数字
2、以 char buf2[2][5]为例 buf2[0][0] 为 char类型
buf2[0] 为 char *类型
buf2 为 char (*)[5]类型
3、若要在二维数组存储字符串,可以采用下面这种形式
char buf2[][5] = {
"a",
"ab",
"abc"
};
4、要注意字符串的长度不能超过数组第二维的坐标,否则会有错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)