第6講 ポインタの学習
第6話 ポインタのポインタによる1次元配列の参照
解答例
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//ポインタのポインタの宣言
c[1]
//ポインタの宣言
int* b;
//1次元配列の宣言
int c[5];
//整数型変数の宣言
int i,j;
//1次元配列にデータを入れる
for(i=0;i<5;i++)c[i]=i+1;
//配列のアドレスをポインタに代入
b=&(c[0]);
//ポインタのポインタの初期化
a=(int** )malloc(20);
//ポインタのポインタにbのアドレスを代入
a=&b;
//文字型変数の宣言と初期化
String^ w=L"";
//ポインタを使ってlable1に配列のデータを表示
for(i=0;i<5;i++)w+=(*(b+i)).ToString()+L" ";
label1->Text=w;
//ポインタのポインタを使ってlable2に配列のデータを表示
w=L"";
for(i=0;i<5;i++)w+=(*(*a+i)).ToString()+L" ";
label2->Text=w;
}
};
}
次に2次元配列をポインタのポインタを使って操作することを考えてみましょう。
1次元配列int c[5]; では、b=cのような代入が可能です。
これはb=&(c[0]); と同じです。要するに、cは配列の最初のアドレスです。
アドレス | 00000000 | 00000004 | 00000008 | 00000012 | 00000016 |
配列 | c[0] | c[1] | c[2] | c[3] | c[4] |
このようにアドレスが割り振られたなら、c=00000000なわけです。
ところが、何故そのようにしたのか私には理解できませんが、
2次元配列 int d[4][5]; に対して
*a=&(a[0][0]); とすることはできても、
a=d; とすることはできません。
このように代入できるようにするためには、
2次元配列 int d[4][5]; に相当するものとして、
配列のポインタ
int *d[4];
のようにして、d[i]を
for(i=0;i<4;i++)d[i]=(int *)malloc(20);
のように初期化しておく必要があります。
malloc(20)の()内の数字20は割り振るメモリが20バイトであることを示します。
int型は4バイトとのメモリを必要としますから、4×5=20バイトを用意すればよいことになります。
4行5列の配列にしたいからです。
このようにすると、
for(i=0;i<4;i++)for(j=0;j<5;j++)d[i][j]=rand()%10;
のようにあたかも2次元配列であるかのように使えます。
これは普通のポインタの場合も同じで、
int *b;
b=(int *)malloc(20);
とすると、
(malloc(20)の()内の数字20は割り振るメモリが20バイトであることを示します。
int型は4バイトとのメモリを必要としますから、4×5=20バイトを用意すればよいことになります。
5は、c[5]の5です。)
for(i=0;i<4;i++)b[i]=rand()%10;
1次元配列のように使えます。
尚、for(i=0;i<4;i++)for(j=0;j<5;j++)d[i][j]=rand()%10; は
for(i=0;i<4;i++)for(j=0;j<5;j++)*(d[i]+j)=rand()%10;
とすることができますし、for(i=0;i<4;i++)b[i]=rand()%10; は
for(i=0;i<4;i++)*(b+i)=rand()%10; とすることもできます。
以上から、ポインタは配列のように扱えることができます。
さて、
int *d[4];
for(i=0;i<4;i++)d[i]=(int *)malloc(20);
とすると、
a=d;
と代入でき、dと同じようにa[i][j]でも*(a[i]+j)でも使えます。
つまり、ポインタのポインタはあたかも2次元配列のように使えるのです。
でも不思議ですね。
単純に
int d[4][5];
と宣言しても、a=d; からa[i][j]や*(a[i]+j)が使えるように文法を定めなかったんでしょうか。
経緯はわかりませんが、とにかくポインタのポインタに代入できる4行5列の行列にするためには、
int *d[4];
for(i=0;i<4;i++)d[i]=(int *)malloc(20);
としなければならないのです。
さて、それではまたForm1を次のように改良して
実行結果が
となるようにコーティングを改良してください。
第5話へ 第7話へ