在我的c应用程序中我有这个typedef:
typedef double mat[2][2];
这是我的功能声明:
aaa(mat bbb, mat ccc, mat * ddd)
在我的代码中,我想计算数学中每个成员的总和,并将结果写入ddd。 我是通过循环完成的,这是主线:
*ddd[i][j] = bbb[i][j] + ccc[i][j];
但是我在ddd中得到了错误的结果。 当我从ddd中删除指针时,我得到了正确的结果,但由于我想通过指针将它返回给用户,我希望得到你的帮助。
我的代码有什么问题?
答案 0 :(得分:3)
你写错了地址。它应该是:
(*ddd)[i][j] = bbb[i][j] + ccc[i][j];
或只是将原型更改为
aaa(mat bbb, mat ccc, mat ddd)
因为无论如何数组都会衰减为指针。 ddd
将是一个副本,但它指向的地址将与原始地址相同。
答案 1 :(得分:1)
传递数组与传递第一个成员的地址相同。由于您的类型是数组,因此您不需要函数定义中的*
。
执行:
aaa(mat bbb, mat ccc, mat ddd)
{
// whatever
ddd[i][j] = bbb[i][j] + ccc[i][j];
// whatever else
}
你很好
答案 2 :(得分:1)
在C中,用作函数参数的数组会衰减到指向数组第一个成员的指针,因此已经通过引用传递。所以在你的情况下,没有必要传递一个指向数组的显式指针,因为指针转换已经在C编译器的编译过程中发生了。
答案 3 :(得分:0)
[]的优先级高于*,您应该使用括号。
(*ddd)[i][j] = bbb[i][j] + ccc[i][j];
不需要将ddd作为指针传递。
aaa(mat bbb, mat ccc, mat ddd)
ddd[i][j] = bbb[i][j] + ccc[i][j];
ddd已经是指向矩阵的指针,上面的代码可以正常工作。