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

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

関連記事

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

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

C++の「->」(アロー演算子)とは?意味や使い方をご紹介

  <目次> (1) C++の「->」(アロー演算子)とは?意味や使い方をご紹介  (1-1) C++の「->」(アロー演算子=arrow operator)とは?  (1-2) …

no image

Base64のプログラムのサンプル(C++言語)と解説

  <目次> (1) Base64のプログラムのサンプル(C++言語)と解説  (1-1) Base64とは?  (1-2) Base64のプログラム例(C++) (1) Base64のプロ …

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

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

C++の「::」の記載の意味について

  <目次> (1) C++の「::」の記載の意味について  (1-1) 「::」の意味は?  (1-2) サンプル①:スコープ演算子「::」を使ってグローバル変数にアクセス  (1-3) …

  • English (United States)
  • 日本語
Top