C/C++の基礎

C・C++の関数と引数の渡し方

このレッスンでは、値渡し、ポインタ渡し、参照渡しという3つの引数の渡し方を比べます。

はじめに

CとC++では、標準では変数を関数に渡すとそのコピーが作られるので、関数の中で変更しても元の変数には影響しません。関数に元の変数を変更させたい場合は、呼び出す側がそれを明示的に許す必要があり、Cではポインタ、C++では参照を使います。

大切なポイント

  • コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
  • それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
  • 入力データと配列のインデックスの範囲は必ずチェックしましょう。

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>

void swap_ints(int *left, int *right) {
    int temporary = *left;
    *left = *right;
    *right = temporary;
}

int main(void) {
    int a = 4, b = 9;
    swap_ints(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
実行結果
9 4
C++
実行 →
main.cpp
#include <iostream>

void swap_ints(int& left, int& right) {
    int temporary = left;
    left = right;
    right = temporary;
}

int main() {
    int a = 4, b = 9;
    swap_ints(a, b);
    std::cout << a << ' ' << b << '\n';
}
実行結果
9 4

CとC++の比較

Cの関数swap_intsは2つの変数のアドレスを受け取り、演算子*でアクセスして値を入れ替えます。C++の参照(reference)は元の変数の別名として働くので、短い書き方で値を変更できます。引数に付けたconstは、関数がデータを読むだけで変更しないことを示します。

C

Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。

C++

C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • 不正な入力や境界の値で試しましょう。
  • 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
  • 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ