ポインタを関数に渡す
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 26/63。
値渡し(pass-by-value)の制限を理解したところで、関数にポインタを渡すことがどのようにこの問題を解決するかを探ってみましょう。変数の値のコピーを渡す代わりに、変数のメモリ番地(アドレス)を関数に渡すことができます。
ポインタを関数に渡すと、その関数はメモリ内にある元の変数の場所にアクセスできるようになります。つまり、関数は単なるコピーではなく、元のデータを直接操作できるということです。
void processValue(int *ptr) {
// ptrは元の変数のアドレスを保持します
// 関数はそのメモリ位置にアクセスできるようになります
}
int main() {
int x = 10;
processValue(&x); // xのアドレスを渡します
return 0;
}関数を呼び出す際に、変数のアドレスを渡すためにアドレス演算子 & を使用していることに注目してください。関数のパラメータは int *ptr として宣言されており、これは整数へのポインタを受け取ることを期待していることを示しています。この基本的な手法により、関数がプログラムのデータと相互作用するための強力な可能性が広がります。
チャレンジ
簡単ポインタを関数に渡す方法を示すC言語のプログラムを作成してください。プログラムの内容は以下の通りです:
- 整数へのポインタを引数として受け取る
displayValueという名前の関数を作成します。 displayValue関数の中で、間接参照演算子を使用してメモリ番地にある値にアクセスし、Value at address: [value]という形式で出力します。main関数の中で、numberという名前の整数型変数を宣言し、値 42 で初期化します。- 元の値を
Original value: [value]という形式で出力します。 - アドレス演算子を使用して
number変数のアドレスを渡し、displayValue関数を呼び出します。 - 関数呼び出しの後、
Function call completedという確認メッセージを出力します。
出力結果は、関数が元の変数のメモリ番地を正常に受け取り、アクセスできていることを示す必要があります:
Original value: 42
Value at address: 42
Function call completedこのチャレンジでは、関数にポインタを渡すという基本的な概念を学びます。これにより、関数は値のコピーを操作するのではなく、元の変数のメモリ位置にアクセスできるようになります。
チートシート
ポインタを関数に渡すと、関数はその値のコピーではなく、元の変数のメモリ位置へのアクセス権を受け取ります。
変数のアドレスを関数に渡すには、アドレス演算子 & を使用します:
void processValue(int *ptr) {
// ptrは元の変数のアドレスを保持します
// 関数はこのメモリ位置にアクセスできるようになります
}
int main() {
int x = 10;
processValue(&x); // xのアドレスを渡します
return 0;
}関数のパラメータは、整数へのポインタを受け取ることを示すために int *ptr として宣言されます。
自分で試してみよう
#include <stdio.h>
// TODO: ここにdisplayValue関数を記述してください
int main() {
// TODO: ここにコードを記述してください
// 1. 変数numberを宣言して初期化する
// 2. 元の値を表示する
// 3. displayValue関数を呼び出す
// 4. 完了メッセージを表示する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。