C言語: アドレスとポインタを関数に渡す – 実践ガイド
C言語: アドレスとポインタを関数に渡す
C言語では、値の代わりにアドレスを渡すことで、関数が元の変数を直接操作できるようになります。この技法はポインタ渡しと呼ばれ、効率的なコードとスコープを超えたデータ変更に不可欠です。
例1: 参照渡しによる2つの整数の交換
#include <stdio.h>
void swap(int *n1, int *n2);
int main(void) {
int num1 = 5, num2 = 10;
/* num1とnum2のアドレスを渡す */
swap(&num1, &num2);
printf("num1 = %d\n", num1);
printf("num2 = %d", num2);
return 0;
}
void swap(int *n1, int *n2) {
int temp = *n1;
*n1 = *n2;
*n2 = temp;
}
実行結果:
num1 = 10 num2 = 5
swap()関数は、元のnum1とnum2を指すポインタn1とn2を受け取ります。これらのポインタを逆参照(*n1と*n2)することで、メモリに格納された実際の値を交換するため、main()側で更新後の数値が見えます。swap()は引数を直接変更するためvoidを返します。
例2: ポインタ経由での値のインクリメント
#include <stdio.h>
void addOne(int *ptr) {
(*ptr)++; /* 与えられたアドレスの値をインクリメント */
}
int main(void) {
int i = 10;
int *p = &i;
addOne(p);
printf("%d", *p); /* 11を出力 */
return 0;
}
ここでは、pがiのアドレスを保持します。addOne()関数は同じアドレスを受け取り、逆参照して元の値をインクリメントします。呼び出し後、*p(ひいてはi)は新しい値11を反映します。
これらの例は、ポインタ渡しの威力を示しています:関数は自身のスコープ外で定義された変数を変更でき、不要なコピーなしで効率的なデータ操作が可能になります。
C言語
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C言語で1次元・2次元配列を関数に渡す方法 – 実践ガイド
- C言語ポインタ完全マスター: 実践的エキスパートガイド
- C言語における配列とポインタの関係を理解する
- C言語 構造体とポインタ: 実践ガイド
- C言語の定数とリテラル:型、使い方、ベストプラクティス