Loading [MathJax]/extensions/tex2jax.js

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つ付いている意味についてご紹介します。
(例)

  1. int **fruit_ptr;

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

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

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

(1-2) 構文

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

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

二重ポインタのサンプルプログラムをご紹介します。(図111)をそのまま実装したようなプログラムになっています。途中で値を更新した際に、各ポインタの値の出力結果も変化する様子が確認できます(参照元の値を変更すると、そのポインタや、ポインタのポインタから参照する値も一緒に変化する)。
 
(サンプル)
  1. #include <iostream>
  2. using namespace std;
  3. int main(void){
  4.  
  5. //# 変数
  6. string fruit = "Apple";
  7. cout << "変数の値:" << fruit << endl;
  8. //# ポインタ
  9. //# ⇒変数fruitのアドレス(&fruit)をポインタに格納
  10. //#  ⇒「fruit」と同じ値になる想定
  11. string *fruit_ptr1 = &fruit;
  12. cout << "ポインタ(1重)の値     :" << *fruit_ptr1 << endl;
  13. //# 二重ポインタ
  14. //# ⇒ポインタ*fruit_ptr1のアドレス(&*fruit_ptr1)をポインタに格納
  15. //#  ⇒「*fruit_ptr1」と同じ値になる想定
  16. string *fruit_ptr2 = &*fruit_ptr1;
  17. cout << "ポインタ(2重)の値(変更前):" << *fruit_ptr2 << endl;
  18. //# 値の書き換え
  19. //# ⇒値を書き換える時は「*fruit_ptr2」に値を直接代入
  20. *fruit_ptr2 = "Hello Rainbow";
  21. //# 値が更新されている事の確認
  22. cout << "ポインタ(2重)の値(変更後):" << *fruit_ptr2 << endl;
  23. //# 参照元の値が更新されているため「*fruit_ptr1」の値も変化
  24. cout << "ポインタ(1重)の値(変更後):" << *fruit_ptr1 << endl;
  25. //# 参照元の値が更新されているため「fruit」の値も変化
  26. cout << "変数の値(変更後):" << fruit << endl;
  27. }
(図131)実行結果

目次にもどる

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

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

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

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

関連記事

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

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

C++のマルチスレッド処理のサンプルや概要について

  <目次> (1) C++のマルチスレッド処理のサンプルや概要について  (1-1) C++のマルチスレッドの概要  (1-2) 構文1:関数ポインタ式  (1-3) 構文1(例):関数ポ …

C++の動的メモリ割当と静的メモリ割当の違いについて

  <目次> (1) C++の動的メモリ割当と静的メモリ割当の違いについて  (1-1) 静的メモリ割当てとは?  (1-2) 動的メモリとは?  (1-3) 動的メモリの割当て  (1-4 …

C++の値渡しと参照渡しの使い分けや違いについて

<目次> (1) C++の値渡しと参照渡しの使い分けや違いについて  (1-1) 「値渡し」とは?  (1-2) 「参照渡し」とは?  (1-3) 「値渡し」と「参照渡し」の使い分け (1) C++の …

no image

C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an lvalue of type ‘const char [x]’」が発生した時の原因と対処

<目次> (1) C++で「error: cannot initialize a variable of type ‘const unsigned char’ with an …

  • English (United States)
  • 日本語
S