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) (参考)「-g」オプションについて (1) Valgrindで行番号を表示 …

C++をLinuxでコンパイルする方法について

  <目次> (1) C++をLinuxでコンパイルする方法について  (1-1) STEP0:【事前準備】ターミナル機能の準備(ターミナル、Teraterm、Putty)  (1-2) S …

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

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

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

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

C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use)」エラーについて

  <目次> (1) C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use) …

  • English (United States)
  • 日本語
Top