C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の*ptr++、*++ptr、++*ptrの違いを徹底解説

C++のポインタ操作では、*ptr++*++ptr++*ptr の3つの書き方がよく登場します。一見似ていますが、それぞれ動作が異なるため、混同するとバグの原因になります。この記事では、演算子の優先順位の観点から、これら3つの違いをサンプルコード付きで詳しく解説します。

演算子の優先順位を理解する

まず、C/C++における後置インクリメントと前置インクリメントの優先順位を確認しましょう。

  • 前置インクリメント(++)や前置デクリメント(--)は、間接参照演算子(*)よりも高い優先順位を持ちます。
  • 後置インクリメント(++)や後置デクリメント(--)は、前置インクリメントと間接参照演算子(*)のどちらよりも高い優先順位を持ちます。

この優先順位により、ptrがポインタである場合、以下のように解釈されます。

  • *ptr++*(ptr++)(ポインタ自体を後置インクリメントしてから間接参照)
  • ++*ptr++(*ptr)(ポインタが指す値をインクリメント)

それでは、実際のコードでそれぞれの動作を確認していきましょう。

例1:++*ptr(ポインタが指す「値」をインクリメント)

#include<iostream>
using namespace std;

int main() {
    char arr[] = "Hello World";
    char *ptr = arr;
    ++*ptr;
    cout << *ptr;
    return 0;
}

出力結果

I

この例では、最初にptrは文字「H」を指しています。++*ptr を実行すると、++(*ptr) と解釈されるため、ポインタが指す値「H」が1増加して「I」になります。ポインタ自体は移動しません。

例2:*ptr++(ポインタ自体を後置インクリメント)

#include<iostream>
using namespace std;

int main() {
    char arr[] = "Hello World";
    char *ptr = arr;
    *ptr++;
    cout << *ptr;
    return 0;
}

出力結果

e

この例でも、最初にptrは「H」を指しています。*ptr++*(ptr++) と解釈されるため、ポインタ自体がインクリメントされ、ptrは次の要素を指すようになります。その結果、「e」が出力されます。

例3:*++ptr(ポインタ自体を前置インクリメント)

#include<iostream>
using namespace std;

int main() {
    char arr[] = "Hello World";
    char *ptr = arr;
    *++ptr;
    cout << *ptr;
    return 0;
}

出力結果

e

この例でもポインタをインクリメントしています。前置インクリメント(++)の優先順位が間接参照演算子より高いため、まずポインタが進められ、その後に値が参照されます。そのため、こちらも「e」が出力されます。

まとめ:3つの書き方の違い

記述解釈動作
++*ptr++(*ptr)ポインタが指す値をインクリメントする
*ptr++*(ptr++)元の位置の値を参照した後、ポインタを進める
*++ptr*(++ptr)ポインタを進めてから、その位置の値を参照する

このように、++ をポインタの前後に置くか、間接参照演算子の前後に置くかで意味が大きく変わります。ポインタと配列を扱うコードを書く際は、優先順位を意識し、必要に応じて括弧を明示的に付けることで、可読性と安全性を高めましょう。

  1. C++とオイラー特性でサッカーボールの五角形・六角形の数を求める方法

    サッカーボールをよく見ると、黒い五角形と白い六角形がパズルのように組み合わさり、完璧な球体を形作っていることがわかります。本記事では、オイラー特性(Euler characteristic)という数学的手法を用いて、サッカーボール上に存在する五角形と六角形の数を求める方法を解説し、最後にC++での実装例も紹介します。 オイラー特性とは オイラー特性とは、位相空間における図形や構造の特徴を表す数値です。球面の場合、オイラー特性は常に2になることが知られており、この性質を利用することで、サッカーボール上の五角形と六角形の数を計算できます。 オイラー特性では、以下の要素を使用します。 χ(S) —

  2. C++とOpenCVで画像を読み込んで表示する方法を徹底解説

    この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name