C:二维数组是如何工作的?

3

对于一个二维数组,

char days[8][10] = { "", "Monday", "Tuesday",
                         "Wednesday", "Thursday", "Friday",
                         "Saturday", "Sunday" };

这里是数组的模型:

image
(图片来源:songjinshan.com)

在主函数中使用如下:

printf("%s\n",days[1]);

产生的结果是星期一,而:
printf("%s\n",days[1][2]);

产生了一个错误。我真的不明白它是如何工作的。


1
days[1][2]n(一个 char)。 - BLUEPIXY
2
展示产生错误的代码。 - ad absurdum
你在主函数中如何使用它? - Chris Gong
3
我现在理解应该使用%c代替%s:printf("%c", days[1][2])。 - DeriZZZsy
3个回答

7

一般来说,对于像

  char days[8][10]

days 是一个包含8个元素的数组,每个元素都是一个包含10个 char 的数组。

换句话说,

  • days 是一个二维数组,
  • days[m] 是其中一个一维数组,
  • days[m][n] 是这个一维数组中的单独元素。

现在,回到问题本身,

main() 函数中使用时...

那么,在更新后的代码中看到的情况是,你将其(days[1])作为参数传递给了 printf() 系列函数中的 %s

在这种情况下,%s 需要一个指向以空字符结尾的字符串的指针,而 days[1] (退化为)指向数组 "Monday" 的第一个元素的指针。所以这是正确的。

另一方面,对于 %s 格式说明符来说,days[1][2] 是不匹配的参数,因为它生成了一个 char,而预期得到的是 char*。要打印 days[1][2],你需要使用 %c 格式说明符。


2
太棒了!正是我在寻找的答案。 - DeriZZZsy

6
在C/C++/Java/C#中,数组是以零为基础的索引。在这里,您创建了字符的2D数组或表格,当您写days [1]时,您正在访问第一行,它是由 String 称为的一维字符数组,当您写days [1] [2]时,您正在访问第二行和第三列的字符(请记住,C中的数组是从零开始索引)。
让我放置一个图片编辑在这里来解释这个概念。

enter image description here

代码使用

现在,如果您想打印 字符,您应该编写类似以下内容的代码:

printf("%c\n", days[1][2]);//You are accessing the character in 2nd row (index 1) and 3rd column (index 2) here

要打印字符串,您应该编写:
printf("%s\n", days[1]);//You are accessing the 2nd string (array of characters) OR 2nd row in 2D array which is at index 1 (remember '0' based index)

1

你试过吗,

printf("%c\n", days[1][2]);

使用%c来指定给printf函数打印一个字符。
使用%s来打印字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接