第10講 ポインタのポインタの学習  
第2話 ポインタのポインタの簡単な演習

では具体的に見ていきましょう。
新規プロジェクトを作り、次のようにコーティングしてみましょう。
#include<iostream>
using namespace std;
using namespace System;
void f();
int main(){
  f();
}
void f(){
  int** a;
  int* b;
  int c;
  c=5;
  b=&c;
  a=(int** )malloc(4);
  *a=b;
  cout<<*b<<endl;
  cout<<**a<<endl;
}
実行結果は、
C言語
で同じです。
b=&c; と *a=b; によって
k
cのアドレスがbと*aに入っています。
ですから、*a=b=&cです。
今回は入れていませんが、bのアドレスも&bもaに代入することもできます。
a=&b;
l
プログラミングは次のように変更しても同じです。
#include<iostream>
using namespace std;
using namespace System;
void f();
int main(){
  f();
}
void f(){
  int** a;
  int* b;
  int c;
  c=5;
  b=&c;
  a=(int** )malloc(4);
  a=
&b;
  cout<<*b<<endl;
  cout<<*b<<endl;
}

入門
これはどういうことでしょうか。
a
int** a;と宣言すると、aと*aと**aの3つを同時に操作できるようになります。
第1話で int *a; と宣言するとポインタ変数aと普通の変数*aを同時に宣言したことになると説明しましたが、
これは比喩的な表現で、もう少し正確に表現するとaから*aを参照できるようになるということです。
この表現を使うと、ポインタのポインタaから*aと**aと参照できます。
int** a; としたとき3つの変数を宣言しているのではなく、宣言しているのはあくまでaのみです。
しかし、*aと**aを見ることができるようになります

u
aには変数bのアドレス&b
(0100000 こう書いているのはあくまで仮のアドレスです。
実際には、こんな単純な割り振りはしませんし、16進数表現です。
わかりやすさ優先でこう表現しています。)
が入っています。*aはそのアドレスのメモリーに収納されているデータを参照しなさい、という命令なのです。
さらに、bにはcのアドレス00000000が入っています。
**aは、そのアドレスのメモリーにはいっているデータ内容を参照しなさいということなのです。
結果的には、aから*aであるbと**aであるcを参照することができます。
*aとはaに収納されているアドレスのメモリ(箱)の中身を見なさいということなのです。
上の例では、aは01000000です。*aとは、01000000というアドレスのメモリの中身ということで00000000が参照されます。
同様にして、**aは*aに収納されているアドレスのメモリ(箱)の中身を見なさいということで5が参照されるのです。
図は次のように書き直した方がわかりやすいでしょうか。
z
結局aから*aと**aが参照できています。

頭が混乱してしまいますが、ポインタを理解するとC言語の仕組みが見えてきます。

魅力があると同時にC言語を難しくしている、と第1話でいった意味が少し見えてきたのではないでしょうか。

最後に課題を出してこの話を閉じましょう。
コード
#include<iostream>
using namespace std;
using namespace System;
void f();
int main(){
  f();
}
void f(){
  int** a;
  int* b;
  int c;
  c=5;
  b=&c;
  a=(int** )malloc(4);
  a=
&b;
  cout<<*b<<endl;
  cout<<*b<<endl;
}

少し変更して、実行結果が
初心者
int c; は配列int c[5]; としてください。
左も右もfor文で実現してください。
今回と同様に左には*bを、右には*aを利用してください。
尚、bに入れストアドレスc[0]を代入するときは

b=&(c[0]); です。



第1話へ 第3話へ


戻る


VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)