簡単な質問があります。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[])longlonglong (*myArray)[]
実際には、このパラメーターを使用して関数を宣言し、 のように配列へのポインターを渡し、 のようmyFunction1(&myArray)に関数内でポインターを使用することができます(*myArray)[0] = 1;。
しかし、C はショートカットを提供してくれます。それを使用しないのは 2 つ目の間違いです。パラメータを として宣言するとlong myArray[]、配列のように見えますが、実際には へlong *myArrayのポインタであるに変換されますlong。次に、配列を として渡すことができますmyFunction1(myArray)。は配列ですがmyArray、C はそれを最初の要素へのポインターに変換します。したがって、引数myArrayはパラメータと一致しますlong myArray[]。次に、関数内で、ポインターを で使用できますmyArray[0] = 1;。
ショートカットは表記が短くなり、より自然な表記であると一般に考えられているため、好まれます。