工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++ポインタ完全ガイド:仕組みと実践例

C++ポインタ

このチュートリアルでは、C++ポインタの仕組みと実践例を通じて、この重要な言語機能をマスターできるよう解説します。

C++において、ポインタは別の変数のメモリアドレスを保持する変数です。ポインタにより直接的なメモリ操作、動的確保、効率的なデータ処理が可能になります。

C++におけるアドレス

変数varが与えられたとき、式&varはそのメモリ内のアドレスを返します。例えば:

例1: C++での変数アドレスの表示

#include <iostream>
using namespace std;

int main() {
    // 変数を宣言
    int var1 = 3;
    int var2 = 24;
    int var3 = 17;
    
    // var1のアドレスを表示
    cout << "var1のアドレス: " << &var1 << endl;
    // var2のアドレスを表示
    cout << "var2のアドレス: " << &var2 << endl;
    // var3のアドレスを表示
    cout << "var3のアドレス: " << &var3 << endl;
}

出力

var1のアドレス: 0x7fff5fbff8ac
var2のアドレス: 0x7fff5fbff8a8
var3のアドレス: 0x7fff5fbff8a4

アドレスは16進数形式で表示されます。連続するアドレス間の4バイトの差は、64ビットシステムでのintの4バイトサイズを反映しています。

注意: 正確なアドレスはプログラム実行ごとに異なる場合があります。


C++ポインタ

前述の通り、ポインタは直接値ではなくアドレスを格納します。ポインタの宣言は簡単です:

int *pointVar;

ここで、pointVarはintへのポインタです。推奨される構文ではアスタリスクを型の隣に置きます:

int* pointVar; // 推奨構文

複数宣言も可能です:

int* pointVar, p;

この行では、pointVarはポインタですが、pは通常のintです。アスタリスクは型ではなく変数名に結合します。

ヒント: *演算子はポインタ宣言に使われ、乗算には使われません。


ポインタへのアドレス代入

ポインタを変数のアドレスに結びつけるには、アドレス演算子&を使います:

int* pointVar, var;
var = 5;
// varのアドレスをpointVarポインタに代入
pointVar = &var;

これでpointVarはvarのメモリアドレスを保持します。


ポインタを使ってアドレスから値を取得

間接参照演算子*は、ポインタが保持するアドレスに格納された値を取得します:

int* pointVar, var;
var = 5;
pointVar = &var;
cout << *pointVar << endl; // 出力: 5

ここで、*pointVarはvarの値(5)を生成します。この演算子は間接参照演算子と呼ばれます。

注意: C++では、pointVar(ポインタ)と*pointVar(指し先の値)は別のものです。


例2: C++ポインタの動作

#include <iostream>
using namespace std;

int main() {
    int var = 5;
    // ポインタ変数を宣言
    int* pointVar;
    // varのアドレスを格納
    pointVar = &var;
    // varの値を表示
    cout << "var = " << var << endl;
    // varのアドレスを表示
    cout << "varのアドレス (&var) = " << &var << endl << endl;
    // ポインタpointVarを表示
    cout << "pointVar = " << pointVar << endl;
    // pointVarが指すアドレスの内容を表示
    cout << "pointVarが指すアドレスの内容 (*pointVar) = " << *pointVar << endl;
    return 0;
}

出力

var = 5
varのアドレス (&var) = 0x61ff08
pointVar = 0x61ff08
pointVarが指すアドレスの内容 (*pointVar) = 5

ポインタが指す値の変更

pointVarがvarを指している場合、*pointVarを変更すると元の変数も変わります:

int var = 5;
int* pointVar;
pointVar = &var;
*pointVar = 1;
cout << var << endl; // 出力: 1

pointVarと&varは同じアドレスを保持するため、間接参照値を変更するとvarが更新されます。


例3: ポインタによる値の変更

#include <iostream>
using namespace std;

int main() {
    int var = 5;
    int* pointVar;
    // varのアドレスを格納
    pointVar = &var;
    // varを表示
    cout << "var = " << var << endl;
    // *pointVarを表示
    cout << "*pointVar = " << *pointVar << endl << endl;
    
    cout << "varの値を7に変更:" << endl;
    // varの値を7に変更
    var = 7;
    cout << "var = " << var << endl;
    cout << "*pointVar = " << *pointVar << endl << endl;
    
    cout << "*pointVarの値を16に変更:" << endl;
    // *pointVarを通じてvarの値を16に変更
    *pointVar = 16;
    cout << "var = " << var << endl;
    cout << "*pointVar = " << *pointVar << endl;
    return 0;
}

出力

var = 5
*pointVar = 5
varの値を7に変更:
var = 7
*pointVar = 7
*pointVarの値を16に変更:
var = 16
*pointVar = 16

ポインタ操作でのよくある間違い

以下は典型的なエラーと正しい扱い方です:

int var, *varPoint;
// 間違い!varPointはアドレスだがvarは値
varPoint = var; 
// 間違い!
// &varはアドレス
// *varPointは&varに格納された値
*varPoint = &var; 
// 正しい!
// varPointはアドレス、&varもアドレス
varPoint = &var;
// 正しい!
// *pointVarとvarは両方とも値
*varPoint = var;

推奨リーディング:

C++ポインタ完全ガイド:仕組みと実践例

C言語

  1. C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
  2. C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
  3. C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
  4. C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
  5. C言語ポインタ完全マスター: 実践的エキスパートガイド
  6. C++ポインタをマスター:概念、例、実践的応用
  7. C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
  8. C++プログラミング言語:概要と主要機能
  9. C++定数とリテラル完全解説:型、構文、ベストプラクティス
  10. C++演算子完全ガイド:種類、使い方、ベストプラクティス
  11. C++数値型完全ガイド:実践的な使い方と数学関数