使用形式参数,我可以声明类型int[N]*
的指针(在下面的代码中为int (*A)[COL]
)。但是我不知道如何将函数返回到这种类型的指针?
在我的代码中,int (*)[COL]
没有任何意义。
非常感谢你。
int (*)[COL] creat_2D_Array(int(*A)[COL], int ROW, int COL) {
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
A[i][j] = rand() % 20 + 1;
}
}
return A;
}
//I add some code below after discussion with user3386109
//Or how can i return to a pointer of int[10]*
int (*)[10] creat_2D_Array(int(*A)[10]) {
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
{
A[i][j] = rand() % 20 + 1;
}
}
return A;
}
答案 0 :(得分:1)
语法类似于函数指针,但是您只使用[...]
而不是(...)
,例如:
type (*identifier)[size]
将函数名称和参数列表放在(* ... )
内:
int (*creat_2D_Array(int (*A)[COL], int ROW, int COL_param))[COL] {
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
A[i][j] = rand() % 20 + 1;
}
}
return A;
}
int (*creat_2D_Array_1(int(*A)[10]))[10] {
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 10; j++)
{
A[i][j] = rand() % 20 + 1;
}
}
return A;
}
第一个COL
函数中的creat_2D_Array
必须是一个常量表达式。
有时我会使用void*
指针,通过这些函数结合一个简单的VLA声明(在函数参数列表内)来返回指向此类函数的未知大小数组的指针,并期望调用方进行强制转换:
void *creat_2D_Array(int ROW, int COL, int A[ROW][COL]) {
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
A[i][j] = rand() % 20 + 1;
}
}
return A;
}
int main() {
int input[5][6];
int (*output)[6] = creat_2D_Array(5, 6, input);
// remember these are pointers, you return the same pointer you inputted
assert(input == output);
}
我发现这种方法很难维护。为一些混淆的对象或结构编写一些访问API和函数更容易使用(并允许声明和其他检查)。
答案 1 :(得分:0)
您无法在C中返回数组。不幸的是,您也无法返回指向VLA的指针。
这是因为该函数在文件作用域中声明,并且您在那里不能拥有VLA,因为它需要具有静态存储持续时间。 C不允许这样做:
// illegal C, syntax error:
int (*create_2D_array(size_t ROW, size_t COL))[ROW][COL];
解决方案是使用指向数组的指针的指针,然后将其作为参数传递:
void create_2D_array (size_t ROW, size_t COL, int(**arr)[ROW][COL]);
示例:
#include <stdio.h>
#include <stdlib.h>
void create_2D_array (size_t ROW, size_t COL, int(**arr)[ROW][COL])
{
*arr = malloc( sizeof(int[ROW][COL]) );
int(*a)[COL] = **arr; // use tmp pointer to allow a[i][j] syntax
for(size_t i=0; i<ROW; i++)
{
for(size_t j=0; j<COL; j++)
{
a[i][j] = i*COL + j;
}
}
}
int main (void)
{
const size_t row = 3;
const size_t col = 2;
int(*arr)[row][col];
create_2D_array(row, col, &arr);
int(*a)[col] = *arr;
for(size_t i=0; i<row; i++)
{
for(size_t j=0; j<col; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
free(arr);
return (0);
}