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);

関数を単純化したい場合、4 つのintポインターの配列を渡す必要がありますか? または、4つの配列で行う必要があり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

これを行う真の C99 の方法は次のとおりです。

int f(int p[static 4])
{
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    p[3] = 4;
    return c;
}

角括弧内は、関数が少なくとも4 つの要素static 4の配列を想定していることをコンパイラに示します。渡した値に少なくとも 4 つの要素が含まれていないことがコンパイル時にわかっている場合、clang は警告を発行します。GCC も警告するかもしれませんが、私はこのコンパイラをあまり使用しません。f

于 2013-06-26T03:27:42.877 に答える
0
  • 関数を単純化したい場合、4 つの int ポインターの配列を渡す必要がありますか? または、4つのintの配列でそれを行う必要がありますか?

4 つの 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 に答える