如何访问作为typedef的2-D数组

时间:2016-06-13 12:33:24

标签: c multidimensional-array typedef

如果我有以下代码

typedef float a[5][2];
a x = {(40,30),(46,30),(56,30),(58,30),(60,30)};

这已成功编译。我在访问上述数组x的元素时遇到问题。

for(i=0;i<5;i++)
{
for(j=0;j<2;j++)
{
printf("\nx[%d][%d]=%f",i,j,*x[z++]);
}
}

以上代码输出

x[0][0]=30.000000
x[0][1]=30.000000
x[1][0]=30.000000
x[1][1]=0.000000
x[2][0]=0.000000
x[2][1]=0.000000
x[3][0]=0.000000
x[3][1]=0.000000
x[4][0]=-1.781255
x[4][1]=0.000000

3 个答案:

答案 0 :(得分:4)

编译警告

  

警告:逗号表达式的左侧操作数无效   [-Wunused值]

由于

a x = {(40,30),(46,30),(56,30),(58,30),(60,30)};

a x = {30, 30, 30, 30, 30};

是一样的。

你想要的是

a x = {{40,30},{46,30},{56,30},{58,30},{60,30}};

(括号而不是括号)

或更好

a x = {{40.f,30.f},{46.f,30.f},{56.f,30.f},{58.f,30.f},{60.f,30.f}};

答案 1 :(得分:1)

代码有几个问题,但我从最激烈的开始。

无效的数组下标

*x[z++]x[z++][0]相同。假设z在开始时为0,您将访问数组元素x[0][0]x[1][0]x[2][0],...,x[8][0]x[9][0]。您正在访问越界,因此获得未定义的行为。最后打印的5个值是垃圾。

只需使用语法x[i][j]

错误的数组初始化程序

(40,30)会扩展为30,因为您没有使用正确的大括号。代码不是非法的,但它不会给出你想要的结果。您的代码等于:

a x = {{30, 30}, {30, 30}, {30, 0}, {0, 0}, {0, 0}};

正确的初始化程序如下所示:

a x = {{40.0f, 30.0f}, {46.0f, 30.0f}, {56.0f, 30.0f}, {58.0f, 30.0f}, {60.0f, 30.0f}};

请注意我是如何使用后缀.0f来表示这些是浮点数的。这不是绝对必要的,但使用正确的类型是很好的做法。

隐藏typedef

后面的数组

这不是错误,但将指针或数组隐藏在typedef后面并不好。在某些情况下(例如数组衰减成指针),数组表现异常,这可能会让程序员感到惊讶。

答案 2 :(得分:0)

声明对象 x 后,它就像普通的二维数组一样工作。但是,我相信你对 printf()的调用的最后一个参数应该传入2-D数组。所以代替:

printf("\nx[%d][%d]=%f",i,j,*x[z++]);

* x [z ++] 应该是这样的:

printf("\nx[%d][%d]=%f",i,j,x[i][j]);

看起来好像是在传递一维数组作为最后一个参数。请记住,如果 z 是您声明的变量,则在示例中显示声明非常有价值。