我的职能:
int f1(int* r1, int* r2, int* r3, int* r4) {
*r1 = 1;
*r2 = 343;
*r3 = 34;
*r4 = 3;
return c; // c = 1 if success
}
caller:
f1 (&r1, &r2, &r3, &r4);
如果我想简化我的功能,我应该传入一个包含四个int
指针的数组吗?或者我应该使用四个int
的数组?
int f1(int* r1[4])?
或
int f1(int r1[4])?
谢谢。
答案 0 :(得分:4)
由于数组在传递给函数时会衰减为指针,因此数组会执行:
void f(int *p)
{
p[0] = 1;
p[1] = 2;
p[2] = 3;
p[3] = 4;
}
int arr[] = { 0, 0, 0, 0 };
f(arr);
答案 1 :(得分:0)
当数组用于函数的参数时,它是一个指针。 所以
int f(int *p) == int f(int r1[])
您不需要编写int f(int r1[4])
。因为编译器在传递给函数时不关心1D数组的大小。
int f1(int* r1[4]) == int f1( int **p ) // That's not what you want.
答案 2 :(得分:0)
真正的C99方法是:
int f(int p[static 4])
{
p[0] = 1;
p[1] = 2;
p[2] = 3;
p[3] = 4;
return c;
}
方括号内的static 4
向编译器指示该函数需要至少 4个元素的数组。如果clang在编译时知道您传递给f
的值不包含至少4个元素,则会发出警告。 GCC也可能会发出警告,但我不经常使用这个编译器。
答案 3 :(得分:0)
四个int的数组
int f1(int r1[4])
{
p[0] = 1;
p[1] = 2;
p[2] = 3;
p[3] = 4;
}
由于数组衰减为指针,因此可以省略数组的大小
int f1(int r1[])
或
int f1(int * r1)
但这是一种糟糕的方式。例如,p[4] = 5
将导致缓冲区溢出,如果不知道缓冲区的大小,编译器无法捕获。