構造体の配列を引数に指定
まずは、下記のように、構造体の配列を引数に指定する方法です。
関数の引数に配列を指定する方法は下記の記事で書いています。
参考:[c言語]関数の引数に配列を指定する3つの書き方(サンプルコードあり)
void initArr(st_t stArr[SIZE]){
//省略
}
実際の関数呼び出し時には、構造体の配列のポインタを引数に渡すことになります。
st_t stArr[SIZE]; initArr(stArr);
下記がサンプルコードになります。関数内で構造体の配列の要素を初期化した後、構造体の配列の要素をprintf出力しています。
$ cat sample1.c
#include <stdio.h>
#define SIZE 5
typedef struct{
int m_d1;
int m_d2;
}st_t;
void initArr(st_t stArr[SIZE]){
int i;
for(i = 0; i < SIZE; i++){
stArr[i].m_d1 = 123;
stArr[i].m_d2 = 456;
}
}
int main(){
st_t stArr[SIZE];
int i;
initArr(stArr);
for(i = 0; i < SIZE; i++){
printf("%d ", stArr[i].m_d1);
printf("%d ", stArr[i].m_d2);
}
return 0;
}
下記が実行結果になります。関数内で構造体の配列の要素が直接書き換えられていて、関数を抜けても構造体の配列の要素の値が保持されているのが確認できます。
$ gcc sample1.c -o sample $ ./sample 123 456 123 456 123 456 123 456 123 456
要素数を指定せずに構造体の配列を引数に指定
続いて、要素数を指定せずに構造体の配列を引数に指定する方法です。
void initArr(st_t stArr[]){
//省略
}
同様に、実際の関数呼び出し時には、構造体の配列のポインタを引数に渡すことになります。
下記がサンプルコードになります。
$ cat sample2.c
#include <stdio.h>
#define SIZE 5
typedef struct{
int m_d1;
int m_d2;
}st_t;
void initArr(st_t stArr[]){
int i;
for(i = 0; i < SIZE; i++){
stArr[i].m_d1 = 234;
stArr[i].m_d2 = 567;
}
}
int main(){
st_t stArr[SIZE];
int i;
initArr(stArr);
for(i = 0; i < SIZE; i++){
printf("%d ", stArr[i].m_d1);
printf("%d ", stArr[i].m_d2);
}
return 0;
}
下記が実行結果になります。
$ gcc sample2.c -o sample $ ./sample 234 567 234 567 234 567 234 567 234 567
スポンサーリンク
構造体の配列へのポインタを引数に指定
最後に、構造体の配列へのポインタを引数に渡す方法です。
void initArr(st_t* stArr){
//省略
}
こちらも同様に、実際の関数呼び出し時には、構造体の配列のポインタを引数に渡すことになります。
下記がサンプルコードになります。
$ cat sample3.c
#include <stdio.h>
#define SIZE 5
typedef struct{
int m_d1;
int m_d2;
}st_t;
void initArr(st_t* stArr){
int i;
for(i = 0; i < SIZE; i++){
stArr[i].m_d1 = 345;
stArr[i].m_d2 = 678;
}
}
int main(){
st_t stArr[SIZE];
int i;
initArr(stArr);
for(i = 0; i < SIZE; i++){
printf("%d ", stArr[i].m_d1);
printf("%d ", stArr[i].m_d2);
}
return 0;
}
下記が実行結果になります。
$ gcc sample3.c -o sample $ ./sample 345 678 345 678 345 678 345 678 345 678
