2

我正在创建一组函数,它们接受一个指向二维数组的指针并用一些数据填充数组

这就是我现在得到它的方式:

17 void m4identity(float *m[4][4]) {
18    *m = (float[4][4]) { { 1, 0, 0, 0 },
19                         { 0, 1, 0, 0 },
20                         { 0, 0, 1, 0 },
21                         { 0, 0, 0, 1 } };
22 }

但不幸的是,我得到一个编译器错误:

linalg.c:18:7: error: incompatible types when assigning to type ‘float *[4]’ from type ‘float (*)[4]’

问题:

  1. (*)[4]和 和有什么不一样*[4]

  2. 有一个更好的方法吗?

    我最初试图返回一个指向函数内部创建的数组的指针,但这引发了另一个编译器错误,因为它超出了范围。我还想避免从函数内部为数组分配空间,因为这很难控制。

4

1 回答 1

1

(*)[4]和 和有什么不一样*[4]

声明说明符具有更高的[]优先级,因此float *arr[4]声明了一个包含 4 个指针的数组float,而float (*arr)[4]声明了一个指针数组的 4- float

有一个更好的方法吗?

只需让数组衰减为指针并使用赋值:

void m4identity(float m[4][4])
{
    memset(m, 0, 4 * sizeof(m[0]));
    for (int i = 0; i < 4; i++) {
        m[i][i] = 1;
    }
}
于 2013-03-25T21:10:12.360 回答