第9講 ポインタの学習  
第3話 ポインタの使い方
では、実際にポインタを使ったプログラムを組んでみましょう。
実は
int *a;
と宣言した後、ポインタの初期化をする必要があります。
前話の
int *a;
int b;
a=&b;
の最後の部分が初期化です。
bのアドレスを入れたのです。

初期化には、次のような方法もあります。
int *a;
a=(int *)malloc(8);(変数=(変数の型 *)malloc(メモリーサイズ);)
実はこのように初期化した場合
int a[2];
を宣言した場合ほぼ同じになります。
では、それを次のコーティングで確認しましょう。#include<iostream>
#include<stdio.h>
using namespace std;
void f();
void g();
int main(){
   cout<<"配列の場合"<<endl;
   f();
   cout<<endl;
   cout<<"ポインタの場合"<<endl;
   g();
}
void f(){
   int a[2];
   a[0]=15;
   a[1]=28;
   cout<<a[0]<<endl;
   cout<<a[1]<<endl;
}
void g(){
   int *a;
   a=(int *)malloc(8);
   a[0]=15;
   a[1]=28;;
   cout<<a[0]<<endl;
   cout<<a[1]<<endl;
}
実行結果
入門
まったく同じ結果が得られました。
つまり、
int *a;
a=(int *)malloc(8);
の宣言は、
int a[2];
と同じようになります。
なぜ要素数2なのでしょうか。
int型は4バイトでした。
ですから8バイトのメモリー容量を用意したということは
8÷4から2個分のint型変数を用意したことになります。

結局ポインタは配列と同じ?

例えば、次のようにコーティングし直してみましょう。
#include<stdio.h>
using namespace std;
void f();
void g();
int main(){
   cout<<"配列の場合"<<endl;
   f();
   cout<<endl;
   cout<<"ポインタの場合"<<endl;
   g();
}
void f(){
   int a[2];
   a[0]=15;
   a[1]=28;
   cout<<a[0]<<endl;
   cout<<a[1]<<endl;
}
void g(){
   int *a;
   a=(int *)malloc(8);
   *a=15;
   *(a+1)=28;;
   cout<<*a<<endl;
   cout<<*(a+1)<<endl;
}
実行結果
基礎
実行結果はまったく変わりありません。さらに、以下のようにコーティングしても同じです。

void g(){
   int *a;
   a=(int *)malloc(8);
   *a=15;
   *(a+1)=28;;
   cout<<a[0]<<endl;
   cout<<a[1]<<endl;
}
または、
void g(){
   int *a;
   a=(int *)malloc(8);
   a[0]=15;
   a[1]=28;;
   cout<<*a<<endl;
   cout<<*(a+1)<<endl;
}

つまり、*(a+1)とa[1]が同じなのです。
試しに
#include<iostream>
#include<stdio.h>
using namespace std;
void f();
void g();
void h();
void i();
void j();
int main(){
   cout<<"配列の場合"<<endl;
   f();
   cout<<endl;
   cout<<"ポインタの場合"<<endl;
   g();
   cout<<endl;
   h();
   cout<<endl;
   i();
   cout<<endl;
   j();
   cout<<endl;
}
void f(){
   int a[25],i;
   for(i=0;i<10;i++){
     a[i]=i+1;
     cout<<a[i]<<" ";
   }
}
void g(){
   int *a,i;
   a=(int *)malloc(100);
   for(i=0;i<10;i++){
     a[i]=i+1;
     cout<<a[i]<<" ";
   }
}
void h(){
   int *a,i;
   a=(int *)malloc(100);
   for(i=0;i<10;i++){
     a[i]=i+1;
     cout<<*(a+i)<<" ";
   }
}
void i(){
   int *a,i;
   a=(int *)malloc(100);
   for(i=0;i<10;i++){
     *(a+i)=i+1;
     cout<<a[i]<<" ";
   }
}
void j(){
   int *a,i;
   a=(int *)malloc(100);
   for(i=0;i<10;i++){
     *(a+i)=i+1;
     cout<<*(a+i)<<" ";
   }
}
実行結果
初心者
実行結果はすべて同じです。
ですから、ポインタにおいてはa[i]と*(a+i)はまったく同じです。

では、ポインタは配列と特に変わりないのでしょうか。


第2話へ 第4話へ


戻る


VB講義へ
VB講義基礎へ

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