第7講 ポインタの学習
第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)<<" ";
皆さん、x=1000(*xの最初のアドレス)なら、
x+1はx=1001だと思いませんか。
だとすれば、*(x+1)=i+1はメモリー1001番地に
代入することになりおかしな話しです。
ポインタに入っているアドレスは先頭アドレスですから、
1000以上1004未満の領域を代表する1000は存在しても、
1001は存在しないからです。
この謎を解明するために、
#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;
for(int i=0;i<5;i++)cout<<x+i<<" ";
cout<<endl;
}
とコードを変更してみてください。
その実行結果は、
です。なんとxのアドレスが013B8370なのに、
x+1のアドレスは013B8371ではなく、013B8374
です。
これは、*iがint型の変数として宣言されているので、
x+1とすると、自動的に4バイト分足してくれて、013B8374となるのです。
x+2は013B8378で納得できます。
x+3は013B837Cとなっていますが、
16進数表示では、
013B8378以降は、013B8379、013B837A、013B837B、013B837C
ですから、013B837Cは013B8378+4です。
最後のx+4についても、
013B837C以降は、013B837D、013B837E、013B837F、013B8380
ですから、013B837C+4になっています。
4バイトの整数を用意した場合、x+iは自動的にx+4*iとなるのです。
従いまして、
xが1000のときは、x+1、x+2、x+3、x+4は
それぞれ1004、1008、1012、1016となり、
*(x+1)が2個目の変数(配列)、
*(x+2)が2個目の変数(配列)、
*(x+3)が2個目の変数(配列)、
*(x+4)が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;
}
の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;
}
の2つがなぜ同じ結果を導くのかを解明しましょう。
第4話へ 第6話へ
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ