考虑给定的2d数组分配:
int (*some)[10] = malloc(sizeof(int[10][10]));
这将分配一个10 x 10 2d数组。显然,它的类型是int (*)[10]
。我想写一个函数initialize()
来分配它,初始化它,然后返回一个指向数组的指针,这样构造some[i][j]
就可以在其他可以将指针传递给数组的函数中使用。它彼此。
原型(特别是initialize()
的返回类型)应该是什么?
答案 0 :(得分:7)
int (*initialize(void))[10] { ... }
initialize
是一个不带参数的函数,它返回指向10
int
数组的指针。
您应该为此使用typedef
。
答案 1 :(得分:0)
将nrow
个指针表分配给size
个元素的(已分配)int数组
void *allocate_rows(int *(*ptr)[size], size_t nrows)
{
int (*tmpptr)[size] = *ptr;
*ptr = malloc(nrows * sizeof(*ptr));
if(*ptr)
{
while(nrows--)
{
tmpptr = malloc(sizeof(*tmpptr));
if(!tmpptr)
{
/* malloc failed do something */
}
else
{
tmpptr++;
}
}
return *ptr;
}
答案 2 :(得分:0)
在
int (*some)[10] = malloc(sizeof *some);
,some
是“指向10个int数组的指针。
如果您希望other
是一个返回指向10个int数组的指针的函数,则可以从int (*some)[10];
开始并将some
替换为对该函数的调用希望得到您的声明。
int (*some)[10];
=> int (*other(argument1,argument2))[10];
这就是在预标准化C语言中的工作方式。由于标准化C语言具有原型,因此您还可以将参数标识符列表替换为参数类型列表,例如:
int (*other(int argument1, double argument2))[10];
cdecl程序或cdecl website can help you verify the result:
$ echo 'explain int (*other(int,double))[10]'|cdecl
declare other as function (int, double) returning pointer to array 10 of int
大多数人发现typedef
更具可读性:
typedef int (*pointer_to_an_array_of_10_int)[10];
pointer_to_an_array_of_10_int other(int, double);
//to verify it's a compatible declaration
int (*other(int , double ))[10];