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++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

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

no image

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

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

CORBA通信のPOA(Portable Object Adapter)とは?

  <目次> (1) CORBA通信のPOA(Portable Object Adapter)とは?  (1-1) 概要と特徴  (1-2) 一般的なPOAの処理構成  (1-3) POAの …

ValgrindのPossibly Lostの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのPossibly Lostの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Possibly Lost」はどんな状況?  (1-2) …

C++のtime関数とlocaltime関数の違いについて

  <目次> (1) C++のtime関数とlocaltime関数の違いについて  (1-1) C++のlocaltime関数の概要とサンプル  (1-2) C++のtime関数の概要とサン …

  • English (United States)
  • 日本語
Top