第7講 ポインタの学習
第6話 配列の先頭アドレスは?
void f(){
int x[5];
for(int i=0;i<5;i++)*(x+i)=i+1;
for(int i=0;i<5;i++)cout<<*(x+i)<<" ";
cout<<endl;
}
void g(){
int *x=(int *)malloc(sizeof(int)*5);
for(int i=0;i<5;i++)*(x+i)=i+1;
for(int i=0;i<5;i++)cout<<*(x+i)<<" ";
cout<<endl;
}
の2つはなぜ同じ結果を導くの?
の問いに答えるには、
int x[5];
で宣言されている配列の先頭アドレスが
どうなっているかを説明しなければなりません。
第7講第3話で
変数 | アドレス | |
int i; | i | &i |
int *i=(int *)malloc(sizeof(int)); | *i | i |
という表が載せてあったことを覚えていらっしゃるでしょうか。
xが普通の変数であれば、
それの先頭アドレスは&xでした。
では、
int x[5];
で宣言される配列xの場合の先頭アドレスは何でしょうか。
(図はイメージであって、
実際のアドレスは、013B8371のような16進数表示)
カンのいい方であればお分かりですね。
1個目の変数はx[0]ですから、
それの先頭アドレス&x[0]です。
そして、&x[0]=xですから、
配列xの先頭アドレスは、xが正解です。
実際、
void f(){
int x[5];
for(int i=0;i<5;i++)x[i]=i+1;
for(int i=0;i<5;i++)cout<<x[i]<<" ";
cout<<endl;
cout<<&x[0]<<endl;
cout<<x<<endl;
}
とコードを変更して実行すると、
となり、&x[0]とxの2つは同じであることが分かります。
int x[5];
宣言される配列xの先頭アドレスがxあるとすれば、
int *x=(int *)malloc(sizeof(int)*5);
で宣言されるポインタxと配列xは実は全く同一のものであることが分かります。
ですから、
void f(){
int x[5];
for(int i=0;i<5;i++)*(x+i)=i+1;
for(int i=0;i<5;i++)cout<<*(x+i)<<" ";
cout<<endl;
}
void g(){
int *x=(int *)malloc(sizeof(int)*5);
for(int i=0;i<5;i++)*(x+i)=i+1;
for(int i=0;i<5;i++)cout<<*(x+i)<<" ";
cout<<endl;
}
の2つは、同じ帰結を導きます。
そして、
void g(){
int *x=(int *)malloc(sizeof(int)*5);
for(int i=0;i<5;i++)x[i]=i+1;
for(int i=0;i<5;i++)cout<<x[i]<<" ";
cout<<endl;
}
が同一の結果を導き出す謎も明らかになります。
ポインタと配列・・・、実体は同じものであるからです。
第5話へ 第7話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ