如果我有以下代码
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
答案 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
后面并不好。在某些情况下(例如数组衰减成指针),数组表现异常,这可能会让程序员感到惊讶。
答案 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 是您声明的变量,则在示例中显示声明非常有价值。