0

固定サイズの配列を取る関数があります。配列の内容はこの関数で変更されるため、配列をポインターとして渡したいと思います。

私の配列の定義は次のとおりです。

int u[] = {1, 0 , a};   //a is an integer
int v[] = {1, 0 , a};   //a is an integer

これが私のプロトタイプです:

void New_Values(int* u[3], int* v[3], const int q);

これが私の関数呼び出しです:

New_Values(&u, &v, q);   //q is an integer

コンパイラ エラーが発生します。

互換性のないポインター型から 'New_Values' の引数 1 を渡しています

互換性のないポインター型から 'New_Values' の引数 2 を渡しています

4

3 に答える 3

4

例外的に、配列へのポインターを関数に渡したい場合があります。他の人が示唆したように、あなたはおそらくそうするでしょう:

void New_Values(int u[], int v[], int q);
void New_Values(int *u,  int *v,  int q);

(これらの宣言は同等です。コンパイラは前者を後者のように記述されているかのように扱います。そのため、ほとんどの場合、配列表記ではなく単純なポインター表記が表示されます。)

そして呼び出し:

New_Values(u, v, q);

配列へのポインターを実際に使用したい場合は、正しい表記法を使用する必要があります。指定しようとしたのは、整数の配列へのポインターではなく、整数ポインターの配列でした。

void New_Values(int (*v)[], int (*v)[], int q);

そして呼び出し:

New_Values(&u, &v, q);

内部New_Values()では、次を使用します。

(*v)[i] = (*u)[j] + q;

これは、C の「宣言構文が使用時の構文と一致する」ことを示しています。

constパラメータからを削除したことに注意してintください。完全に無意味というわけではありませんが、呼び出された関数がパラメーターを変更したとしても、呼び出された関数が呼び出し元の関数の値を変更する危険はありません。

于 2012-09-02T22:06:20.430 に答える
3

関数がポインタを取るようにするだけです:

void New_Values(int *u, int *v, const int q);

そして、それらを配列のように使用してください。このコンテキストでは、配列は最初の要素へのポインターに崩壊します。また、&関数呼び出しから を削除して、次のように言う必要があります。New_Values(u, v, q);

于 2012-09-02T21:59:06.533 に答える
1

配列がポインタに崩壊するので、配列名を渡すだけです。

次のように渡します。

New_Values(u, v, q);

および関数プロトタイプ:

void New_Values(int* u, int* v, const int q);
于 2012-09-02T22:00:16.867 に答える