Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++で変数にアスタリスク(*)が2つ付いている意味について

投稿日:2021年10月20日 更新日:

 

<目次>

(1) C++で変数にアスタリスク(*)が2つ付いている意味について
 (1-1) 変数にアスタリスク(*)が2つ付いている意味
 (1-2) 構文
 (1-3) サンプルプログラム
 (1-4) 補足:「int **ptr = new int*;」(左辺*2つ&右辺*1つ)について

(1) C++で変数にアスタリスク(*)が2つ付いている意味について

本記事では次のように変数の前にアスタリスクが(*)が2つ付いている意味についてご紹介します。
(例)

int **fruit_ptr;

(1-1) 変数にアスタリスク(*)が2つ付いている意味

最初に、アスタリスク(*)が1つの場合の意味についてです。1つの場合は「変数のポインタ」、つまり「メモリ上のアドレスを保持する変数」の意味になります。

//# ポインタ
int *fruit_ptr1;
ポインタについては下記の記事でご紹介しているので、もしポインタの基礎から確認したい方は先に下記の記事に目を通して頂けたらと思います。
 
 
なので、アスタリスク(*)が2つ付いた場合は「ポインタのポインタ」を意味します。イメージとしては下図のような状況です。
 
1つ目のポインタである「fruit_ptr1」は変数のアドレス情報を保持しており、2つ目のポインタ「fruit_ptr2」は1つ目のポインタのアドレスを保持しています。
 
(図111)

(1-2) 構文

ポインタの前に更にアスタリスク(*)を付ける事で「ポインタのポインタ」を表現する事ができます。
(構文)
//# 二重ポインタの定義(int型の例)
int **変数名;
//# 二重ポインタの値の書き換え
**変数名 = 値;

(1-3) サンプルプログラム

二重ポインタのサンプルプログラムをご紹介します。(図111)をそのまま実装したようなプログラムになっています。途中で値を更新した際に、各ポインタの値の出力結果も変化する様子が確認できます(参照元の値を変更すると、そのポインタや、ポインタのポインタから参照する値も一緒に変化する)。
 
(サンプル)
#include <iostream>
using namespace std;
int main(void){

    //# 変数
    string fruit = "Apple";
    cout << "変数の値:" << fruit << endl;
    
    //# ポインタ
    //# ⇒変数fruitのアドレス(&fruit)をポインタに格納
    //#  ⇒「fruit」と同じ値になる想定
    string *fruit_ptr1 = &fruit;
    cout << "ポインタ(1重)の値     :" << *fruit_ptr1 << endl;
    
    //# 二重ポインタ
    //# ⇒ポインタ*fruit_ptr1のアドレス(&*fruit_ptr1)をポインタに格納
    //#  ⇒「*fruit_ptr1」と同じ値になる想定
    string *fruit_ptr2 = &*fruit_ptr1;
    cout << "ポインタ(2重)の値(変更前):" << *fruit_ptr2 << endl;
    
    //# 値の書き換え
    //# ⇒値を書き換える時は「*fruit_ptr2」に値を直接代入
    *fruit_ptr2 = "Hello Rainbow";
    //# 値が更新されている事の確認
    cout << "ポインタ(2重)の値(変更後):" << *fruit_ptr2 << endl;
    
    //# 参照元の値が更新されているため「*fruit_ptr1」の値も変化
    cout << "ポインタ(1重)の値(変更後):" << *fruit_ptr1 << endl;
    //# 参照元の値が更新されているため「fruit」の値も変化
    cout << "変数の値(変更後):" << fruit << endl;
}
(図131)実行結果

目次にもどる

(1-4) 補足:「int **ptr = new int*;」(左辺*2つ&右辺*1つ)について

⇒★cpp_ int**=new int*で掲載予定

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

C++の「int **g = new int*;」の意味について

  <目次> (1) C++の「int **g = new int*;」の意味について  (1-1) 「int **g = new int*;」の意味  (1-2) サンプルで理解を深める …

C++の構造体とは?の作り方や使い方について

  <目次> (1) C++の構造体とは?の作り方や使い方について  (1-1) 構造体とは?  (1-2) サンプルプログラム  (1-3) 構造体の変数を定義する方法  (1-4) 構造 …

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

C++の共用体とは?構造体との違いや使用方法について

  <目次> (1) C++の共用体とは?構造体との違いや使用方法について  (1-1) 共用体とは?構造体との違いは?  (1-2) 共用体の定義方法、変数定義方法、初期化方法  (1-3 …

  • English (United States)
  • 日本語
Top