C 无法理解此函数定义

C 无法理解此函数定义,c,function,C,Function,如何解释这个函数定义?我应该如何向它传递参数 void matmul(float (*A)[N],int BlockX, int BlockY) 第一个参数是指向N元素数组的指针: float a[N]; matmul(&a, 2, 3); >(注意代码< n>代码>必须是C89和C++中的编译时常数;在C89中,它本质上必须是定义为< /代码> d作为一些文字值。在C99中,您有可变长度数组。< /P> 由于数组会衰减为指针,因此还可以为其提供一个数组: float b[M][N

如何解释这个函数定义?我应该如何向它传递参数

void matmul(float (*A)[N],int BlockX, int BlockY)

第一个参数是指向
N
元素数组的指针:

float a[N];
matmul(&a, 2, 3);
<> >(注意代码< n>代码>必须是C89和C++中的编译时常数;在C89中,它本质上必须是<代码>定义为< /代码> d作为一些文字值。在C99中,您有可变长度数组。< /P> 由于数组会衰减为指针,因此还可以为其提供一个数组:

float b[M][N];
matmul(b, 2, 3);

第一个参数是指向
N
元素数组的指针:

float a[N];
matmul(&a, 2, 3);
<> >(注意代码< n>代码>必须是C89和C++中的编译时常数;在C89中,它本质上必须是<代码>定义为< /代码> d作为一些文字值。在C99中,您有可变长度数组。< /P> 由于数组会衰减为指针,因此还可以为其提供一个数组:

float b[M][N];
matmul(b, 2, 3);

编写相同原型的另一种方法是

void matmul(float A[][N],int BlockX, int BlockY)
哪个更好地显示了它通常应该接收的内容,一个二维数组,对于它来说,
N

  • 编译时整数常量(不是
    const
    变量!),如果您只有C89
  • 如果使用现代C99,可以在定义点处计算的任何整数表达式
另一个维度没有指定,你必须知道或以某种方式传递它

在我看来,这个接口很旧,因为它似乎使用
int
参数来传递大小信息。实现这一点的现代方法(避免32/64位问题和类似的问题)是对这些数量使用
size\u t

如果这两个参数碰巧对应于“实”矩阵维度,那么在现代C语言中,您的定义应该如下

void matmul(size_t m, size_t n, float A[m][n]) {
   ...
}

重要的是,
m
n
A
之前,这样它们就已经被知道了,在那里。

编写相同原型的另一种方法是

void matmul(float A[][N],int BlockX, int BlockY)
哪个更好地显示了它通常应该接收的内容,一个二维数组,对于它来说,
N

  • 编译时整数常量(不是
    const
    变量!),如果您只有C89
  • 如果使用现代C99,可以在定义点处计算的任何整数表达式
另一个维度没有指定,你必须知道或以某种方式传递它

在我看来,这个接口很旧,因为它似乎使用
int
参数来传递大小信息。实现这一点的现代方法(避免32/64位问题和类似的问题)是对这些数量使用
size\u t

如果这两个参数碰巧对应于“实”矩阵维度,那么在现代C语言中,您的定义应该如下

void matmul(size_t m, size_t n, float A[m][n]) {
   ...
}

重要的是,
m
n
A
之前,这样它们就已经被知道了。

这就是C/C++。(*A)[N]是指向浮点的N个指针的数组。这是C/C++。(*A)[N]是一个由N个指向浮点的指针组成的数组。但是在函数定义中,它们是以2D数组的形式访问它的。我没有得到它。当然,指针也可能是数组的衰变:
float b[m][N];matmul(b,2,4)已编辑。不,对于mondern C,又称C99,
N
不一定是编译时常量。@JensGustedt:啊,VLAs。。。。但这可能会让人非常困惑:
intn=5;无效matmul(浮动(*)[N],整数,整数);int main(){N=3;float a[N][N];matmul(a,1,1);}
wird…@KerrekSB,背叛是一个强有力的词。这些是动态类型。通过引入虚拟继承,C++与类型系统有其自身的弹性。这些至少会带来同样多的问题。但让我们坚持C,这是一个C问题。C99是C的当前标准。但是在函数定义中,他们是以2D数组的形式访问它的,我不明白。当然,指针也可能是数组的衰变:
float b[m][N];matmul(b,2,4)已编辑。不,对于mondern C,又称C99,
N
不一定是编译时常量。@JensGustedt:啊,VLAs。。。。但这可能会让人非常困惑:
intn=5;无效matmul(浮动(*)[N],整数,整数);int main(){N=3;float a[N][N];matmul(a,1,1);}
wird…@KerrekSB,背叛是一个强有力的词。这些是动态类型。通过引入虚拟继承,C++与类型系统有其自身的弹性。这些至少会带来同样多的问题。但让我们坚持C,这是一个C问题。C99是C的当前标准。