二维数组功能测试,超详细

#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、要注意字符串的长度不能超过数组第二维的坐标,否则会有错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值