3

我的功能:

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])?

谢谢你。

4

4 回答 4

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);
于 2013-06-26T00:47:16.920 回答
0
  • 如果我想简化我的函数,我应该传入一个由四个 int 指针组成的数组吗?还是我应该用四个 int 的数组来做?

四个 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会导致缓冲区溢出,编译器在不知道缓冲区大小的情况下无法捕获。

于 2013-06-26T03:45:07.830 回答
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 也可能会发出警告,但我不经常使用这个编译器。

于 2013-06-26T03:27:42.877 回答
0

当数组用于函数的参数时,它是一个指针。所以

int f(int *p) == int f(int r1[])

您不需要编写int f(int r1[4]). 因为编译器在传递给函数时不关心一维数组的大小。

int f1(int* r1[4]) == int f1( int **p )  // That's not what you want.
于 2013-06-26T02:50:17.337 回答