2

簡単な質問があります。C プログラムを持っています。long の配列があり、この配列へのポインタを 2 つの関数に渡したいと思います。この方法で配列を渡すのは正しいですか?

long[] myArray


void myFunction1(long *myArray[]){

*myArray[0] = 1;

}

void myFunction2(long *myArray[]){

*myArray[1] = 2;

}

これは正しいですか?

4

3 に答える 3

2

さて、それについて考えてみましょう:

long myArray[3]; // This is an array of 3 long's

long *myArray[3]; // Is this? No, this is an array of 3 pointers to longs.

それはほとんど答えを教えてくれます。

void myFunction1(long *myArray[]){

これは、配列を関数に渡す方法ではありません (long またはそれ以外)。配列だけを取る必要があります:

void myFunction1(long myArray[]){
    myArray[0] = 1;

またはポインタを取ることができます:

void myFunction1(long *myArray){
    myArray[0] = 1;

配列がポインターに減衰するため、これは機能します。

于 2013-05-08T17:13:49.273 に答える
1

を宣言するときvoid myFunction1(long *myArray[])、私はあなたが 2 つの間違いを犯していると思います。

1つは、これを配列へのポインターにするつもりだったと思います。ただし、大括弧 は、アスタリスク よりも[]識別子 に強く結合します。したがって、パラメーターはへのポインターの配列ですが、 の配列へのポインターを意図していたと思います。これは になります。myArray*long *(myArray[])longlonglong (*myArray)[]

実際には、このパラメーターを使用して関数を宣言し、 のように配列へのポインターを渡し、 のようmyFunction1(&myArray)に関数内でポインターを使用することができます(*myArray)[0] = 1;

しかし、C はショートカットを提供してくれます。それを使用しないのは 2 つ目の間違いです。パラメータを として宣言するとlong myArray[]、配列のように見えますが、実際には へlong *myArrayのポインタであるに変換されますlong。次に、配列を として渡すことができますmyFunction1(myArray)。は配列ですがmyArray、C はそれを最初の要素へのポインターに変換します。したがって、引数myArrayはパラメータと一致しますlong myArray[]。次に、関数内で、ポインターを で使用できますmyArray[0] = 1;

ショートカットは表記が短くなり、より自然な表記であると一般に考えられているため、好まれます。

于 2013-05-08T17:21:32.757 に答える