第9講 ポインタの学習
第4話 配列とポインタの違い
違います。ポインタの方が、弾力的だし広範囲の応用領域をもっています。
違いはいくつかあります。
まず、ポインタはアドレスを直接操作できることです。
さらに、ポインタの場合、ポインタのポインタ、ポインタのポインタのポインタと重層的に使えます。
(普通変数へのポインタとか、ポインタへのポインタという表現を使います。
*aの場合、a変数へのポインタと表現しますし、
**aなら変数へのポインタは*aで、ポインタへのポインタはaであると表現します。
しかし、わかりやすさを優先して、本サイトではそのような表現は使いません。
変数へのポインタは、変数のポインタあるいはただ単にポインタと表現します。
そして、ポインタへのポインタはポインタのポインタと表記します。)
ポインタのポインタは次の話で説明します。
アドレスを直接操作できることを次のコードで確認しましょう。
#include<iostream>
#include<stdio.h>
using namespace std;
void f();
int main(){
f();
}
void f(){
int *a;
a=(int *)malloc(100);
a=0;
cout<<a<<endl;
a++;
cout<<a<<endl;
}
実行結果
アドレスを代入して、アドレスの操作もできるのです。
さらに、fを次のように変更しましょう。
void f(){
int *a;
a=(int *)malloc(100);
*a=5;
a++;
*a=10;
cout<<*a<<" "<<*(a-1)<<endl;
}
実行結果
a++;はアドレスを操作しています。
配列でいじれるのは、箱の中身だけです。
ポインタの場合箱の中身とともに、箱の番地も操作できるのです。
番地を操作することによって、箱から箱へ移動できるのです。
変数や配列の場合は、箱の名称をもってしか箱を移動することはできません。
この違いは、名前か番地かでたいした違いがないと思うかもしれませんね。
つまり、Aさんのお家、Bさんのお家と表現するか
藤原区5-3-2、六本木3-2-6と表現しても、
現実の世界ではたいした違いではありません。
しかし、コンピュータの世界では、大きな違いがあるのです。
番地を扱える方が、圧倒的に強みがあるのです。
なぜなら、番地を制御できるということはあらゆる変数、あらゆる関数を自在に操れるからです。
ところで、次にポインタのポインタを学習しますが、
これは2次元配列と同様な機能をもっています。
ですから、何話か後ではポインタのポインタを使って、
前に作った4次および6次魔方陣作成プログラムを書き換えますが、
実は、ただのポインタでも2次元配列を扱うことができのでただのポインタでも書き換え可能です。
次のコードで確認しましょう。
#include<iostream>
#include<stdio.h>
using namespace std;
void f();
void g();
int main(){
cout<<"2次元配列の場合"<<endl;
f();
cout<<endl;
cout<<"ポインタの場合"<<endl;
g();
}
void f(){
int i,j,a[4][4];
for(i=0;i<4;i++){
for(j=0;j<4;j++){
a[i][j]=4*i+j+1;
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(a[i][j]<10)cout<<a[i][j]<<" ";
if(a[i][j]>=10)cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
void g(){
int i,j,*a;
a=(int *)malloc(64);
for(i=0;i<16;i++){
*(a+i)=i+1;
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(*(a+4*i+j)<10)cout<<*(a+4*i+j)<<" ";
if(*(a+4*i+j)>=10)cout<<*(a+4*i+j)<<" ";
}
cout<<endl;
}
}
実行結果
確かに同じ結果です。
皆さんの頭には、?もあるでしょうが、これを使って前の
?が消えるように次話で詳しく説明しますから。
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)