Cで配列を参照渡しするには?質問する

Cで配列を参照渡しするには?質問する

C で構造体の配列を参照渡しするにはどうすればよいでしょうか?

例:

struct Coordinate {
   int X;
   int Y;
};
SomeMethod(Coordinate *Coordinates[]){
   //Do Something with the array
}
int main(){ 
   Coordinate Coordinates[10];
   SomeMethod(&Coordinates);
}

ベストアンサー1

C では、配列は最初の要素へのポインターとして渡されます。これらは、実際には値で渡されない唯一の要素です (ポインターは値で渡されますが、配列はコピーされません)。これにより、呼び出された関数は内容を変更できます。

void reset( int *array, int size) {
   memset(array,0,size * sizeof(*array));
}
int main()
{
   int array[10];
   reset( array, 10 ); // sets all elements to 0
}

ここで、配列自体 (要素の数など) を変更したい場合、スタックまたはグローバル配列では変更できません。ヒープ内の動的に割り当てられたメモリでのみ可能です。その場合、ポインターを変更するには、ポインターを渡す必要があります。

void resize( int **p, int size ) {
   free( *p );
   *p = malloc( size * sizeof(int) );
}
int main() {
   int *p = malloc( 10 * sizeof(int) );
   resize( &p, 20 );
}

質問編集では、構造体の配列を渡すことについて具体的に質問しています。そこには 2 つの解決策があります。typedef を宣言するか、構造体を渡していることを明示的に指定します。

struct Coordinate {
   int x;
   int y;
};
void f( struct Coordinate coordinates[], int size );
typedef struct Coordinate Coordinate;  // generate a type alias 'Coordinate' that is equivalent to struct Coordinate
void g( Coordinate coordinates[], int size ); // uses typedef'ed Coordinate

宣言したとおりに型を typedef することができます (これは C では一般的な慣用句です)。

typedef struct Coordinate {
   int x;
   int y;
} Coordinate;

おすすめ記事