0

実行時に作成された 2 つの整数配列があります (サイズはプログラムの入力によって異なります)。ある時点で、ある配列の内容を他の計算を行う内容で更新する必要があります。

最初に、C で関数を返す方法が見つからなかったため、これらの配列をパラメーターとして関数に渡すことを考えました (それが可能だとは思わないでください)。パラメータはスタックにコピーされるため実際には変更できないため、これは悪い考えであることに気付いた後、代わりに配列ポインタに変更することにしました。

関数はまだ空ですが、これは私が持っているコードです:

1 回目 (コードのコンパイル、エラーなし):

// Elements is just to be able to iterate through their contents (same for both):
void do_stuff(int first[], int second[], int elements) {}

// Call to the function:
do_stuff(first, second, elements);

2 番目のテイクでは、配列をその場で変更できるようにポインターに変換しようとします。

void do_stuff(int *first[], int *second[], int elements) {}

// Call to the function:
do_stuff(&first, &second, elements);

このコードは、正当なコンパイル時エラーにつながります。配列へのポインターであると私が考えていたのは、明らかにポインターの配列だったからです。

3番目のテイク、正しい構文だと思います:

void do_stuff(int (*first)[], int (*second)[], int elements) {}

// Call to the function:
do_stuff(&first, &second, elements);

それでも、配列の要素にアクセスしようとすると、このコードはコンパイル時エラーを生成します (例*first[0]):

error: invalid use of array with unspecified bounds

私の質問は、関数のパラメーターとして配列ポインターを使用する可能性に関するものですが、可能ですか? もしそうなら、どのようにそれを行うことができますか?

とにかく、2 番目の配列の内容を含む計算を実行した後に最初の配列を更新するより良い方法を考えている場合は、それについてコメントしてください。

4

3 に答える 3

2

配列は、配列に割り当てられたデータへのポインターに減衰します。関数に渡すとき、配列はスタックにコピーされません。したがって、配列へのポインターを渡す必要はありません。したがって、以下は正常に機能するはずです。

// Elements is just to be able to iterate through their contents (same for both):
void do_stuff(int first[], int second[], int elements) {}

// Call to the function:
do_stuff(first, second, elements);

2回目の試行でのエラーの原因は、int *first[](および他の同様のもの)が実際にはint へのポインターの型配列であるためです。

3 番目のエラーの原因は、*first[N]実際に*(first[N])は であり、簡単には実行できません。配列へのアクセスは、実際にはポインター演算のファサード*(first + sizeof first[0] * N)です。ただし、ここには不完全な要素タイプがあります。配列のサイズを指定する必要があります。それ以外の場合sizeof first[0]は不明です。

于 2012-08-29T01:27:42.357 に答える
1

あなたの最初の試みは正しいです。C で配列をパラメーターとして渡す場合、配列のコピーではなく、最初の要素へのポインターが実際に渡されます。だからあなたはどちらかを書くことができます

void do_stuff(int first[], int second[], int elements) {}

あなたが持っていたように、または

void do_stuff(int *first, int *second, int elements) {}
于 2012-08-29T01:28:35.400 に答える
0

C 配列では、データへのポインターに自動的に減衰するため、配列とその長さを渡すだけで、目的の結果を得ることができます。

私の提案は次のようなものです。

void dostuff(int *first, int firstlen, int *second, int secondlen, int elements)

関数呼び出しは次のようにする必要があります。

 do_stuff(first, firstlen, second, secondlen, elements);

なぜ必要なのか、あなたの質問からはよくわかりませんelements。ただし、配列は関数に渡されると自動的にポインターに減衰するため、配列の長さを渡す必要がありますが、呼び出された関数では、それらのサイズを決定する方法はありません。

于 2012-08-29T01:31:08.567 に答える