【发布时间】:2018-10-24 11:07:42
【问题描述】:
在下面的代码中,(*ptr)[1] 不应该是(ptr)[1] 吗?因为ptr 也是一个指针,因为a 在a[][] 中。
int a[][3] = {1, 2, 3, 4, 5, 6};
int (*ptr)[3] = a;
printf("%d", (*ptr)[1]);
【问题讨论】:
-
int a[][3]不是标准 C。您使用的是什么编译器? -
@chux -- 我觉得还可以;就像在
int x[] = { 1, 2, 3 };中一样,编译器从初始化器中推断出未指定的维度。int a[][3]或多或少是一回事。冗长的版本如下所示:typedef int x[3]; x a[] = { 1, 2, 3, 4, 5, 6 };。我并不是说这是一件好事,只是说这是合法的。 -
@pete 很公平 - 我确实收到警告“警告:初始化器 [-Wmissing-braces] 周围缺少大括号”。 your suggestion 也一样。期待像
int a[][3] = {{1, 2, 3}}; -
@chux -- 是的;规则说您不需要花括号,但是将它们排除在外会使理解初始化程序的含义变得更加困难。此示例的全支撑初始值设定项是
{ { 1, 2, 3 }, { 4, 5, 6 } },因为a的每个元素都是一个由3 个整数组成的数组。这更清楚地表明其中有 2 个元素。