1. ホーム
  2. c

C言語で配列を参照渡しする?

2023-12-09 18:53:57

質問

C言語で構造体の配列を参照渡しする方法を教えてください。

例として

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

どのように解決するのですか?

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 );
}

質問の編集で、構造体の配列を渡すことについて具体的に尋ねています。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;