如何传入一个整数指针数组

时间:2013-06-26 00:43:46

标签: c

我的职能:

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 个答案:

答案 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的数组吗?

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