第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)はまったく同じです。
では、ポインタは配列と特に変わりないのでしょうか。
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)