🇯🇵 日本語 | 🇺🇸 English

第24回 関数(基本)

C言語の関数の定義と呼び出し。引数・戻り値の仕組みを図解。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • int add(int a, int b) { return a + b; }
  • 関数は使う前にプロトタイプ宣言
  • return で値を返す
⭐ 余裕があれば読む
  • void 戻り値と void 引数
  • 引数は値渡し(呼び出し元は変わらない)
  • ローカル変数のスコープ

関数 ― 処理をまとめて名前をつける

関数は「入力を受け取り、処理をして、結果を返す」コードのかたまりに名前をつけたもの。数学の「関数」にとてもよく似ています。

📐 数学の関数とのアナロジー

中学・高校で習った f(x) = 2x + 1 を思い出してください。
f(x) = 2x + 1
f(3) と書くと → x に 3 を入れて計算 → 7 が出てくる
f(10) と書くと → x に 10 を入れて計算 → 21 が出てくる
C言語の関数もまったく同じ発想です。名前を呼び出すと、決められた処理を行って結果を返します。

✨ 数学の f(x) = 2x + 1 をCで書くと

// 数学: f(x) = 2x + 1
int f(int x) {
    return 2 * x + 1;
}

int main(void) {
    printf("%d\n", f(3));    // → 7
    printf("%d\n", f(10));   // → 21
    return 0;
}
対応関係: 数学の f(x) が関数、Cの int f(int x) も関数。呼び方(f(3))も意味(「xに3を入れる」)も同じ。

🔗 用語の対応表

数学の用語Cの用語
関数名関数名f, add, sqrt
変数(引数)
独立変数
引数(パラメータ)f(x)x
関数の値
従属変数
戻り値(返り値)f(3) = 77
定義式関数の本体{ return 2*x + 1; }
代入引数渡しf(3) = 「x=3 として計算」

🤝 2変数の関数も同じ

// 数学: g(x, y) = x + y
int add(int a, int b) {
    return a + b;
}
// add(3, 5) は g(3, 5) と同じ → 8 を返す
戻り値の型
int
「値域」の型
関数名
add
数学の g と同じ
引数
int a, int b
入力変数(独立変数)
return文
return a+b;
関数の値を返す

⚠️ 数学の関数と違うところ ― C言語ならではの特徴

アナロジーは便利ですが、完全に同じではありません。次の違いを知っておくと誤解しません。
① 引数と戻り値に「型」がある
数学では f(x) = 2x + 1 の x は実数でも整数でも勝手に動きますが、C では入力も出力も型を明示する必要があります。
int f(int x) は「整数を受け取って整数を返す」専用。小数を渡すなら double f(double x) と書き分けます。
② 「副作用」を持てる ― 値を返さない関数もある
数学の関数は「入力から一意に値を決めるだけ」ですが、C の関数は画面に出力する・ファイルを書き換える・変数を変更するなど外部への作用(副作用)を持てます。
void hello(void) {        // 戻り値なし (void)
    printf("Hello!\n");   // 画面に出す「副作用」
}
void は「値を返さない」という意味。数学にはない概念です。
③ 同じ入力でも違う値を返せる
数学の f(3) はいつ計算しても 7。でも C の関数は毎回違う値を返すことがあります。
int r = rand();        // 呼ぶたびに違う乱数
int n = getchar();     // 毎回ユーザー入力
time_t t = time(NULL); // 現在時刻
外部状態(乱数シード・標準入力・システム時刻)に依存するためです。
④ 引数は「コピー」される(値渡し)
数学では x という変数を「渡す」感覚ですが、C では呼び出し元の変数の値だけがコピーされ、関数内で変えても呼び出し元は変わりません。
void change(int x) { x = 100; }  // 中でxを100にしても
int main(void) {
    int a = 5;
    change(a);
    printf("%d\n", a); // → 5(呼び出し元は変わらない)
}
この挙動を変えたいときは「ポインタ」を使います(後の講座)。
⑤ 引数なしの関数も書ける
数学では引数なしの関数はあまり見ませんが、C では入力ゼロ個の関数も普通にあります。
int get_year(void) {   // void は「引数なし」
    return 2026;
}
外部から値を取ってきたり、固定値を返す用途で使います。
🎯 ポイント: 「関数 = 入力 → 処理 → 出力」の基本は数学と同じ。ただしC言語では 型・副作用・値渡し という実行環境ならではの約束が加わる、と覚えておけば大丈夫です。

ステップ実行 ― 関数呼び出し

function_demo.c

コールスタック

変数の状態

変数名スコープ

標準出力

 

自分で書いてみよう ― 関数

my_func.c
出力
「実行」を押してください...
💡 こんなことも試してみよう

関連する講座

関数編
第25回 関数の深掘り
C言語の関数を深く理解。値渡し・コールスタック・再帰関数を解説。
関数編
第28回 プロトタイプ・マクロ
C言語のプロトタイプ宣言と#defineマクロの使い方を解説。
入門編
第3回 変数
C言語の変数とは?int, double, charの使い方を図解で解説。
← 前の講座
第23回 確認問題(文字列)
次の講座 →
第25回 関数の深掘り

確認クイズ

この講座の理解度をチェックしましょう!

Q1. 関数の戻り値の型が void の意味は?

整数を返す
何も返さない
エラー

void は「空」を意味し、戻り値がないことを示します。return文を省略できます。

Q2. 関数の引数は何と呼ばれる?

グローバル変数
仮引数(パラメータ)
定数

関数定義で受け取る変数を「仮引数(パラメータ)」、呼び出し時に渡す値を「実引数(アーギュメント)」と呼びます。

Q3. 関数内で宣言した変数のスコープは?

プログラム全体
その関数内のみ
ファイル全体

関数内で宣言した変数は「ローカル変数」で、その関数の中でのみ有効です。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。