这个函数原型在C语言中是否有效?
如果是这样,我该如何定义这些函数?
int (*func())[*];
如果是这样,我该如何定义这些函数?
int (*func())[*];
*
符号表示法仅在参数列表中有效。extern float (*first_row(unsigned, unsigned, float (*)[*][*]))[];
float (*first_row(unsigned n, unsigned m, float (*matrix)[n][m]))[]
{
return *matrix;
}
unsigned n = 3, m = 4;
float matrix[n][m];
float (*row)[m] = first_row(n, m, &matrix);
f
也可以返回使用 malloc 分配的 VLA 指针,类似于 int (*p)[m] = malloc(…);
,之后它可以有用地返回 p
,如果 C 类型系统允许将 m
更自动地从 p
的类型传递到接收 f()
结果的 lvalue,那就太好了。但显然这是不可能的:必须重复 m
,这意味着在 float (*recipient)[m] = f();
中存在所有错误风险。 - Pascal Cuoqtypedef
来避免重复。 - Christophf(size_t m)
创建并初始化大小为 m
的数组,并返回指向该数组的指针,应将其放置在类型为“大小为 m
的数组指针”的变量中)。 - Pascal Cuoqtypedef float row_of_m[m]
,然后以这种方式声明matrix
和row
(甚至可能使用该类型添加另一个first_row
的原型?);你说得对,这对于你考虑的用例没有帮助;无论如何,我反对引入这样的typedef,因为它对可读性有负面影响。 - Christophmalloc
和 realloc
。您需要两个大小参数,并且在重新分配的情况下,需要一个指向1-D数组的指针。换句话说,您已经在调用程序中声明了 int (*array_2D)[X];
,并且将其分配给 int (*foo_alloc(size_t m, size_t n))[];
的结果以分配大小为 m * n
的2-D数组,其中 n
的位置将传递 X
。这样一个函数的函数指针将是 int (*(*allocfn)(size_t, size_t))[];
。 - user539810typedef
:typedef int (*ArrayPtr)[]; ArrayPtr foo_alloc(size_t, size_t); ArrayPtr (*allocfn)(size_t, size_t);
- user539810从技术上讲,你可以这样做,但这不是一个好主意。
int * func(size_t s)
{
int array[s];
return array;
}
p[5]
来获取第五个元素;而对于整个数组的指针,您需要执行p[0][5]
或(*p)[5]
。 - user2357112[*]
替换为[]
即可。 - Christophint (*func())[5]
)用于声明返回指向固定大小数组的指针函数。 - user2357112