C 语言中的二维数组打印,求指教!

2020-02-02 12:31:19 +08:00
 iTvX
char b[2][2][20] = {
{"nihao","sdf"},
{"sdfs","dsfsf"}
};

printf("%s",b[0][0]);

打印结果是 nihao

比如我要打印这个,必须二维数组后面加一个长度[20],我一直没搞清楚为什么一定要这个呀?是不是二维数组打印,一定要三维数组引入才能打印啊,好困惑

我新学 C,这个我查了 google 没查到,在 Stack Overflow 也问了,但是人家说我问题不够具体,只有跑到 V2EX 来问了

如果问题我没说清楚的话,我再说一遍,就是我想打印“nihao”,但是直接用二维数组打印不出来,必须在后面加一个[20],为什么呀
3023 次点击
所在节点    C
18 条回复
heart4lor
2020-02-02 12:34:57 +08:00
字符串是一个字符数组,就是你所说的第三维
iTvX
2020-02-02 12:36:34 +08:00
@heart4lor 就是说,打印字符串,一定要用到三维数组吗?我还是有点困惑
Cielsky
2020-02-02 12:42:25 +08:00
你这样想,一维是一行数据,比如 asdffg
二维是 m 行 n 列数据,是个矩形
三维就是个立方体了
打印字符串一维就够了啊
iTvX
2020-02-02 12:44:13 +08:00
@Cielsky 我试了,一维好像不行,只能打 char。。。

我想问的就是,为什么打印这个“nihao”,后面要加一个 [20] 作为三维数组才能打印呢?

就是很困惑这个
fengtons
2020-02-02 13:02:56 +08:00
因为字符串就是一个字符数组,char str[5]="nihao",再结合你想要的思考一下就明白了。
还有 C 语言多维数组规定最后一维必须要指定长度,所以你要填上[20]
nameme
2020-02-02 13:12:00 +08:00
@fengtons 这么说最后一维长度指定 1 就可以了?
BingoXuan
2020-02-02 13:16:44 +08:00
完全不清楚你这个二维数组最基础的元素类型是什么。如果最基础类型是字符串(数组),那么实际是三维字符数组,二维的字符串数组。所以初始化就是 char b[2][2][20]。而如果是整型,那么就是 int b[2][2]。
yzwduck
2020-02-02 13:26:19 +08:00
如果要去掉结尾的 [20] 的话,只需要把声明改成 char *b[2][2] = {{"a...", "b..."}, {"c...", "d..."}}。
如果声明是 char b[2][2][20],可以理解为它是 2x2 个长度固定为 20 字节的字符串,表达式 b[x][y] 实际上也是 b[x][y][0] 的地址;
反之,如果声明成 char *b[2][2],它是 2x2 个字符串指针,表达式 b[x][y] 是实际存放在这个数组里的一个值。
iTvX
2020-02-02 13:37:16 +08:00
@BingoXuan 额 我这类型不是写在里面吗。。

char b[2][2][20] = {
{"nihao","sdf"},
{"sdfs","dsfsf"}
};
fengtons
2020-02-02 13:37:47 +08:00
@nameme 最后一维是字符串的最大长度,比如所有字符串都不超过 10 个字符的话可以填 10
iTvX
2020-02-02 13:37:53 +08:00
@fengtons
@yzwduck

懂了懂了 谢谢你们!!!
xiri
2020-02-02 14:02:21 +08:00
“nihao”本身就是一个一维数组了,你定义的
char b[2][2][20] = {
{"nihao","sdf"},
{"sdfs","dsfsf"}
};
可以理解成每个元素都是一个一维数组的二维数组(实际上就是三维数组)
iTvX
2020-02-02 14:08:48 +08:00
@fengtons 还有个小疑问

“C 语言多维数组规定最后一维必须要指定长度,所以你要填上[20]”

那它可不可以看成是二维数组加上指定长度呢?所以它到底是不是三维数组呢?
netstu
2020-02-02 15:09:21 +08:00
一楼直接说明白了啊
Cielsky
2020-02-02 15:10:05 +08:00
是这样,你需要多看书
钻牛角尖了
看到指针,你就知道啥意思了
mxalbert1996
2020-02-02 15:37:52 +08:00
@iTvX 你这里的字符串类型实际上是 char[],所以字符串类型的二维数组实际上就是 char 类型的三位数组。
fengtons
2020-02-02 17:27:25 +08:00
@iTvX C 语言里没有字符串这种类型,字符串就是字符类型的数组,所以具体到你的问题就是个字符类型的三维数组
MadHouse
2020-02-02 21:44:45 +08:00
你搞混了 char 和 string, 所以 c++才加了 string 类型方便开发者使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX