広告スペース

第21回 関数の深掘り

C言語の関数を深く理解。値渡し・コールスタック・再帰関数を解説。

戻り値のある関数

関数は引数を受け取り、計算して、戻り値を返すことができます。
int square(int n) {    // 戻り値の型 int
  return n * n;        // return で値を返す
}
int main(void) {
  int r = square(5);  // 関数呼び出し。rに25が入る
  printf("%d\n", r);
}
引数
関数に渡す値。( ) の中
戻り値
関数から返す結果。return文で指定
関数名(引数)
呼び出し。戻り値が式の値となる

void型 ― 「なし」を表す

引数や戻り値がないことを表すには void を使います。
// 戻り値なし、引数なし
void sayHello(void) {
  printf("Hello!\n");     // returnは書かなくてもOK
}

// 戻り値なし、引数あり
void printBox(int n) {
  for(int i=0; i<n; i++) printf("*");
  printf("\n");
}

// 戻り値あり、引数なし
int getAnswer(void) {
  return 42;
}
main関数: int main(void) は「引数なし、戻り値はint」を意味します。

複数引数と型

引数はコンマで区切って複数渡せます。それぞれ型を指定する必要があります。
double triangleArea(double base, double height) {
  return base * height / 2.0;
}

int main(void) {
  double area = triangleArea(6.0, 4.0);
  printf("面積 = %f\n", area); // 12.000000
}
型を揃える: int宣言の引数にdouble値(例: 3.5)を渡すと、小数部分が切り捨てられて渡されます。

関数呼び出し中のメモリ(コールスタック)

関数が呼ばれると、その関数専用のメモリ領域(スタックフレーム)が作られ、終わると解放されます。
「次のステップ」を押して関数呼び出しの流れを確認
ポイント:

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

funcs.c
出力
「実行」を押してください...
広告スペース

関連する講座

関数編
第20回 関数(基本)
C言語の関数の定義と呼び出し。引数・戻り値の仕組みを図解。
関数編
第22回 プロトタイプ・マクロ
C言語のプロトタイプ宣言と#defineマクロの使い方を解説。
関数編
第23回 グローバル変数
C言語のグローバル変数・スコープ・変数の寿命・static変数を解説。
← 前の講座
第20回 関数(基本)
次の講座 →
第22回 プロトタイプ・マクロ

確認クイズ

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

Q1. C言語で関数に配列を渡すとき、実際に渡されるのは?

配列のコピー
配列の先頭アドレス
配列のサイズ

C言語では配列名はポインタ(先頭要素のアドレス)として渡されます。配列全体のコピーは作られません。

Q2. 再帰関数に必要不可欠なものは?

グローバル変数
終了条件(ベースケース)
ポインタ

再帰関数は自分自身を呼び出すため、終了条件がないと無限再帰になりスタックオーバーフローを起こします。

Q3. 関数ポインタの用途として正しいのは?

メモリの解放
コールバック関数の実装
文字列の操作

関数ポインタは関数のアドレスを保持し、コールバックや関数テーブルの実装に使われます。

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

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

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

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

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