簡単な質問があります。C プログラムを持っています。long の配列があり、この配列へのポインタを 2 つの関数に渡したいと思います。この方法で配列を渡すのは正しいですか?
long[] myArray
void myFunction1(long *myArray[]){
*myArray[0] = 1;
}
void myFunction2(long *myArray[]){
*myArray[1] = 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;
配列がポインターに減衰するため、これは機能します。
を宣言するときvoid myFunction1(long *myArray[])
、私はあなたが 2 つの間違いを犯していると思います。
1つは、これを配列へのポインターにするつもりだったと思います。ただし、大括弧 は、アスタリスク よりも[]
識別子 に強く結合します。したがって、パラメーターはへのポインターの配列ですが、 の配列へのポインターを意図していたと思います。これは になります。myArray
*
long *(myArray[])
long
long
long (*myArray)[]
実際には、このパラメーターを使用して関数を宣言し、 のように配列へのポインターを渡し、 のようmyFunction1(&myArray)
に関数内でポインターを使用することができます(*myArray)[0] = 1;
。
しかし、C はショートカットを提供してくれます。それを使用しないのは 2 つ目の間違いです。パラメータを として宣言するとlong myArray[]
、配列のように見えますが、実際には へlong *myArray
のポインタであるに変換されますlong
。次に、配列を として渡すことができますmyFunction1(myArray)
。は配列ですがmyArray
、C はそれを最初の要素へのポインターに変換します。したがって、引数myArray
はパラメータと一致しますlong myArray[]
。次に、関数内で、ポインターを で使用できますmyArray[0] = 1;
。
ショートカットは表記が短くなり、より自然な表記であると一般に考えられているため、好まれます。