【C言語】関数の引数と戻り値
関数の基本
C言語の関数は、特定の処理をまとめて記述し、再利用可能にするための仕組みです。
#include <stdio.h>
// 関数の定義
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
printf("3 + 5 = %d\n", result);
return 0;
}
関数には「引数」と「戻り値」があり、それによって外部からデータを受け取り、結果を返すことができます。
引数の種類
C言語の関数には、いくつかの引数の渡し方があります。
値渡し
通常の引数の渡し方で、関数内で変更しても元の変数には影響しません。
#include <stdio.h>
void changeValue(int x) {
x = 10;
}
int main() {
int num = 5;
changeValue(num);
printf("num = %d\n", num); // num は変わらない
return 0;
}
ポインタ渡し
ポインタを使用することで、関数内で変数の値を変更できます。
#include <stdio.h>
void changeValue(int *x) {
*x = 10;
}
int main() {
int num = 5;
changeValue(&num);
printf("num = %d\n", num); // num は 10 に変更される
return 0;
}
戻り値の種類
C言語の関数は、以下のようなデータ型を返すことができます。
整数型を返す
int square(int x) {
return x * x;
}
浮動小数点型を返す
double divide(double a, double b) {
return a / b;
}
ポインタを返す
#include <stdio.h>
int* getPointer(int *x) {
return x;
}
ポインタを使った引数
ポインタを使うことで、関数内で値を変更することが可能です。
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
配列を引数にする
関数に配列を渡す際は、ポインタとして渡されるため元の配列が変更される可能性があります。
void printArray(int arr[], int size) {
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
構造体を引数・戻り値にする
構造体を引数として渡す場合、コピーされるため元のデータには影響しません。
struct Point {
int x, y;
};
void printPoint(struct Point p) {
printf("Point(%d, %d)\n", p.x, p.y);
}
ポインタを使えば、元の構造体を変更できます。
void movePoint(struct Point *p, int dx, int dy) {
p->x += dx;
p->y += dy;
}
関数ポインタを引数・戻り値にする
関数ポインタを引数にすることで、柔軟な処理が可能になります。
void executeFunction(void (*func)(void)) {
func();
}
可変長引数
引数の数が異なる場合、可変長引数を使うことができます。
#include <stdarg.h>
#include <stdio.h>
void printNumbers(int count, ...) {
va_list args;
va_start(args, count);
for(int i = 0; i < count; i++) {
printf("%d ", va_arg(args, int));
}
va_end(args);
printf("\n");
}
まとめ
C言語の関数は、引数の渡し方や戻り値の種類によって多様な使い方が可能です。ポインタや構造体、関数ポインタなどを活用することで、柔軟なプログラム設計ができます。