配列の引数
配列は、複数の要素をまとめて扱うためのデータ構造です。
C言語では、関数に配列を引数として渡すことができます。
配列を引数として渡す場合、配列の先頭要素へのポインタが渡されます。
配列の引数の仕組み
配列を引数として渡すとき、関数内では実際には配列の先頭要素へのポインタが受け取られます。
これは、配列の要素がメモリ上で連続して配置されているため、先頭要素のアドレスを知ることで他の要素にもアクセスできるからです。
配列の引数は、関数のプロトタイプ宣言や関数定義の引数リストで、以下のように宣言します。
void 関数名(データ型 配列名[])
または
void 関数名(データ型 *配列名)
配列の引数の例
以下の例では、配列を引数として受け取り、配列の要素を合計する関数を定義しています。
#include <stdio.h>
// 配列の要素を合計する関数
int sumArray(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = sizeof(numbers) / sizeof(numbers[0]);
int result = sumArray(numbers, size);
printf("配列の合計: %d\n", result);
return 0;
}
このプログラムでは、sumArray関数
が配列とその要素数を引数として受け取り、配列の要素を合計しています。
main関数
では、numbers
配列とその要素数を渡して、sumArray関数
を呼び出しています。
実行結果は以下のようになります。
配列の合計: 15
このように、配列を引数として渡すことで、関数内で配列の要素を操作することができます。
配列の要素数も引数として渡すことで、関数内で正確な要素数を扱うことができます。
文字列の引数
文字列の引数の仕組み
C言語では、文字列を引数として渡す場合、実際には文字列の先頭アドレスを引数として渡します。
文字列は、文字の配列として表現されるため、配列の先頭アドレスを渡すことで、関数内で文字列を操作することができます。
文字列の引数は、関数の宣言や定義において、文字列を表すポインタ型の引数を使用します。
ポインタ型の引数は、関数内で文字列を参照するための手段となります。
文字列の引数の例
以下の例では、文字列を引数として受け取り、その文字列を出力する関数を定義しています。
#include <stdio.h>
void printString(char* str) {
printf("%s\n", str);
}
int main() {
char message[] = "Hello, World!";
printString(message);
return 0;
}
この例では、printString
という関数を定義し、引数としてchar*型
のstr
を受け取っています。
printf関数
を使って、引数で受け取った文字列を出力しています。
main関数
では、message
という文字列を定義し、printString関数
に渡しています。
printString関数
内では、引数として受け取った文字列を出力するため、Hello, World!
が表示されます。
このように、文字列を引数として渡すことで、関数内で文字列を操作したり、表示したりすることができます。
構造体の引数の仕組み
構造体は、関連する複数のデータをひとまとめにするためのデータ型です。
関数に構造体を引数として渡すことで、複数のデータをまとめて扱うことができます。
構造体を引数として渡す場合、以下のような手順で行います。
- 関数の引数リストに、構造体の型と名前を指定します。
- 関数内で、引数として渡された構造体のメンバにアクセスするために、ドット演算子(.)を使用します。
構造体の引数を受け取る関数の宣言の例を示します。
void printPerson(struct Person p);
上記の例では、struct Person
という構造体型の引数を受け取るprintPerson
という関数を宣言しています。
構造体の引数の例
以下の例では、Person
という構造体を定義し、その構造体を引数として受け取る関数を作成します。
#include <stdio.h>
// Person構造体の定義
struct Person {
char name[20];
int age;
};
// Person構造体を引数として受け取り、情報を表示する関数
void printPerson(struct Person p) {
printf("名前: %s\n", p.name);
printf("年齢: %d\n", p.age);
}
int main() {
// Person構造体のインスタンスを作成
struct Person person1;
// 構造体のメンバに値を代入
strcpy(person1.name, "山田太郎");
person1.age = 25;
// printPerson関数にperson1を引数として渡す
printPerson(person1);
return 0;
}
上記のプログラムでは、Person
という構造体を定義し、printPerson
という関数を作成しています。
main関数
内で、Person
構造体のインスタンスperson1
を作成し、そのメンバに値を代入しています。
そして、printPerson関数
にperson1
を引数として渡しています。
実行結果は以下のようになります。
名前: 山田太郎
年齢: 25
このように、構造体を引数として渡すことで、関数内で構造体のメンバにアクセスし、情報を表示することができます。
構造体を引数として渡すことで、関数間でデータを共有することができるため、プログラムの柔軟性や効率性を向上させることができます。
可変長引数
可変長引数は、関数に可変の引数を渡すための仕組みです。
通常、関数の引数の数は固定されていますが、可変長引数を使用することで、引数の数を柔軟に変えることができます。
可変長引数の仕組み
可変長引数を使用するためには、stdarg.h
というヘッダファイルをインクルードする必要があります。
このヘッダファイルには、可変長引数を扱うためのマクロや型が定義されています。
可変長引数を受け取る関数の宣言では、引数リストの最後に...
を記述します。
可変長引数を扱うためのマクロは、va_list型
の変数を宣言し、va_startマクロ
で可変長引数の処理を開始します。
その後、va_argマクロ
を使用して引数を取得し、処理を行います。
最後に、va_endマクロ
で可変長引数の処理を終了します。
可変長引数の例
以下の例では、可変長引数を使用して、与えられた整数の合計を計算する関数を作成します。
#include <stdio.h>
#include <stdarg.h>
int sum(int count, ...)
{
int total = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++)
{
int num = va_arg(args, int);
total += num;
}
va_end(args);
return total;
}
int main()
{
int result = sum(3, 1, 2, 3);
printf("合計: %d\n", result);
return 0;
}
上記のコードでは、sum関数
が可変長引数を受け取り、与えられた整数の合計を計算しています。
sum関数
の引数として、最初の引数には与えられる整数の個数を指定し、その後に可変長の引数を指定します。
va_list型
の変数args
を宣言し、va_startマクロ
で可変長引数の処理を開始します。
for
ループを使用して、va_argマクロ
を使って引数を取得し、合計を計算します。
最後に、va_endマクロ
で可変長引数の処理を終了します。
上記の例では、sum(3, 1, 2, 3)
という形で関数を呼び出しています。
この場合、与えられた整数の合計は6となります。