第7講 ポインタの学習
第4話 第2話コードの謎の解明に向けての第1歩
*iは普通の変数であり、iは*iのアドレスを入れるポインタ変数である・・・
この事実を知ってはじめて、第2話のコード
#include<iostream>
#include <stdlib.h>
using namespace std;
void f();
void g();
void main(){
f();
g();
}
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;
}
#include<iostream>
#include <stdlib.h>
using namespace std;
void f();
void g();
void main(){
f();
g();
}
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;
}
の4つが同じ
実行結果になるかの謎を解明することができます。
int *x=(int *)malloc(sizeof(int)*5);
は、変数*xを用意してintサイズ5つ分のメモリーを割り振りなさいでした。
intサイズは4バイトでしたから、
4×5=20バイトのメモリーを確保・用意したということです。
例えば、00B6FA64~00B6FA68とメモリーが割り振られるのです。
ですから、
int *x=(int *)malloc(sizeof(int)*5);
は
int *x=(int *)malloc(20);
と同じです。
また、
int x[5];
と宣言すると、要素数5つのint型の配列を用意せよという命令ですから、
5つ分のint型のメモリーを確保することになりますから、
00B6FA64~00B6FA68
などと配列用にメモリーが割り振られます。
すなわち、メモリーの割り振りという観点からすると、
int *x=(int *)malloc(sizeof(int)*5);
int x[5];
の2つは全く同じ事なのです。
では、なぜ
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;
}
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;
}
の4つの実行結果が同じなのでしょうか。
まず
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;
}
の実行結果が同じになる理由から説明しましょう。
int *x=(int *)malloc(sizeof(int)*5);
int *x=(int *)malloc(20);
のいずれでも、int型変数5つ分のメモリー20バイト分が割り振られます。
実際には、00B6FA64~00B6FA68などと16進数表示で割り振られるのですが、
わかりやすくするため10進数表示で
1000から1020までが割り振られるとします。
配列int x[5];の場合
1個目の変数は、x[0]ですし、
2個目の変数は、x[1]ですし、
3個目の変数は、x[2]ですし、
4個目の変数は、x[3]ですし、
5個目の変数は、x[4]です。
ポインタint *x=(int *)malloc(sizeof(int)*5);の場合も
同様にメモリーが割り振られます。
では、どうして、
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)<<" ";
のとき、
int x[5];
for(int i=0;i<5;i++)x[i]=i+1;
for(int i=0;i<5;i++)cout<<x[i]<<" ";
と同じ結果になるのでしょうか。
第3話へ 第5話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ