ポインタによる変数の書き換え
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 27/63。
今や、ポインタの真の力を活用することができます。それは、関数を通じて元の変数を変更することです。関数にポインタを渡すと、その関数はデリファレンス演算子を使用して、そのメモリ番地に格納されている値を変更することができます。
関数内では、* 演算子を使用してポインタをデリファレンスし、元の変数の値にアクセスして変更します。この手法は、変数のメモリ上の場所への参照を渡しているため、参照渡し(pass-by-reference)と呼ばれます。
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // デリファレンスして元の値を変更する
}
int main() {
int x = 5;
doubleValue(&x); // xのアドレスを渡す
// xは10になりました!
return 0;
}重要なのは、代入の左辺で *ptr を使用して、ポインタが保持するメモリ番地の値を変更することです。これにより、関数は呼び出し元の関数の変数を永続的に変更できるようになり、値渡し(pass-by-value)では到底実現できない強力なプログラミングの可能性が広がります。
チャレンジ
簡単ポインタを介して変数を変更する方法を示すC言語プログラムを作成してください。整数の値を3倍にする関数を作成します。
プログラムの要件は以下の通りです:
- 整数のポインタをパラメータとして受け取る
tripleValueという名前の関数を作成します。 tripleValue関数内で、間接参照演算子を使用して、そのメモリ番地にある値を3倍にします。tripleValue関数内で、新しい値を"Value tripled to: [value]"という形式で出力します。main関数内で、numberという名前の整数型変数を宣言し、値 8 で初期化します。- 元の値を
"Original value: [value]"という形式で出力します。 - アドレス演算子を使用して
number変数のアドレスを渡し、tripleValue関数を呼び出します。 - 関数呼び出しの後、
numberの最終的な値を"Final value: [value]"という形式で出力します。
出力結果は、関数がポインタを介して元の変数を正常に変更したことを示す必要があります:
Original value: 8
Value tripled to: 24
Final value: 24このチャレンジでは、ポインタを使用した参照渡し(pass-by-reference)の威力を示します。関数はポインタをデリファレンス(間接参照)してそのメモリ位置の値を書き換えることで、元の変数を恒久的に変更することができます。
チートシート
ポインタを使用することで、関数を通じて元の変数を変更できます。この手法は、メモリ内の変数の場所への参照を渡しているため、参照渡しと呼ばれます。
関数内では、* 演算子を使用してポインタをデリファレンスし、元の変数の値にアクセスして変更します:
void doubleValue(int *ptr) {
*ptr = *ptr * 2; // 元の値を変更するためにデリファレンスする
}
int main() {
int x = 5;
doubleValue(&x); // xのアドレスを渡す
// xは10になりました!
return 0;
}代入の左辺で *ptr を使用して、ポインタが保持するメモリアドレスの値を変更します。これにより、関数は呼び出し元の関数の変数を永続的に変更できるようになります。
自分で試してみよう
#include <stdio.h>
// TODO: ここに tripleValue 関数を記述してください
int main() {
// TODO: ここにコードを記述してください
// number 変数を宣言して初期化します
// 元の値を表示します
// tripleValue 関数を呼び出します
// 最終的な値を表示します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。