第10講 ポインタのポインタの学習  
第3話 第2話問題解答例
初心者
コード例
#include<iostream>
using namespace std;
using namespace System;
void f();
int main(){
   f();
}
void f(){
   int** a;
   a=(int** )malloc(4);
   int* b;
   int c[5];
   int i;
   for(i=0;i<5;i++){
     c[i]=i+1;
     b=&(c[i]);
     cout<<*b<<" ";
   }
   cout<<" ";
   for(i=0;i<5;i++){
     c[i]=i+1;
     b=&(c[i]);
     a=&b;
     cout<<**a<<" ";
   }
   cout<<endl;
}

さて、不思議なことにポインタのポインタは2次元配列と同様に扱うことができます。
また、ポインタのポインタのポインタは3次元配列と同様に、
ポインタのポインタのポインタのポインタは4次元配列と同様に扱えます。
つまり、ポインタのn乗(比喩的な表現です。)は、n次元配列同様に扱えます。

ポインタのポインタを2次元配列として使うには、例えば次のように宣言します。
int **a;
a=(int **)malloc(20);
for(int i=0;i<5;i++)a[i]=(int *)malloc(20);
こう宣言すると、
int a[5][5];
宣言した場合と同じように使うことができます。

for(int i=0;i<5;i++)a[i]=(int *)malloc(20); は今までこういう書き方をしてきていませんでしたが、
int i;
for(i=0;i<5;i++){
  a[i]=(int *)malloc(20);
}
の簡略表現です。if文と同じように、命令文が1文しかない場合
for(i=0;i<5;i++)A;
にように書けるわけです。
簡略表現ができることがC言語の特徴の1つですが、
for(int i=0;i<5;i++)a[i]=(int *)malloc(20); のような書き方は私は使用しない方がよいと思います。
理由は、2つあります。
1つめは、
for文が何回も出てくる場合
int i;
としておけば、以後はiの宣言は必要ありません。
ところが、
int i;
と宣言しない場合
for(int i=0;i<5;i++)のintの部分は毎回入れなければなりません。
つまり、このような宣言方式の場合、そのfor文の範囲の中でしか有効ではありません。
2つめは、あんまり簡略表現を入れすぎるとプログラムがわかりにくくなります。
やはり、
int** a;
int i;
a=(int **)malloc(20);
for(i=0;i<5;i++){
  a[i]=(int *)malloc(20);
}
書いた方がよいと思います。
プログラムは、自分だけでなく他人も読みます。
多少面倒でも、わかりやすい表現を心がけるべきです。
ところで、
a=(int **)malloc(20);
for(i=0;i<5;i++){
  a[i]=(int *)malloc(20);
}
の意味は何でしょうか。

a=(int **)malloc(20);
はint a[5][5];前半の5を宣言することに対応します。
int型は4バイトですから、20÷4=5です。
for(i=0;i<5;i++){
  a[i]=(int *)malloc(20);
}
はint a[5][5];後半の5を宣言したのに対応します。

さて、実行画面が次のようになるコードを考えましょう。
入門

第2話へ 第4話へ


戻る


VB講義へ
VB講義基礎へ

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