第11講 ポインタの学習
第6話 ポインタと配列の関係その2
#include<stdio.h>
#include <stdlib.h> //malloc()を使うために必要
void f();
void g();
int main(){
f();
g();
return(0);
}
void f(){
int x[5];
for(int i=0;i<5;i++)x[i]=i+1;
for(int i=0;i<5;i++)printf("%d ",x[i]);
printf("\n");
}
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++)printf("%d ",*(x+i));
printf("\n");
}
コピペ用添付ファイル
の実行画面
1 2 3 4 5
1 2 3 4 5
まったく変わりありません。
*xとx[0]
*(x+1)とx[1]
*(x+2)とx[2]
*(x+3)とx[3]
*(x+4)とx[4]
が対応しています。
xだとアドレス、*xだとそのアドレスにある箱の中身でした。
x[0]もアドレスがxである箱の中身なのです。
箱または箱の中身(整数) | 箱または箱の住所 | |
int *xと宣言 | *x | x |
int *xと宣言 | x[0] | x |
さらに、
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++)printf("%d ",x[i]);
printf("\n");
}
としても変わりません。
これはどういうことなのでしょうか。
ポインタxの先頭アドレスが
1000だとすると、i=1のときx+iは1000+1で1001のハズですが、
xがint型のポインタとして宣言されていますので、
コンピュータは、自動的に
i=1のときx+iに対して1000+4
i=2のときx+iに対して1000+8
i=3のときx+iに対して1000+12
i=4のときx+iに対して1000+16
と解釈してくれるのです。
アドレスを収納する変数がポインタですが、
そのアドレスはあくまで先頭アドレスのみです。
int型のポインタの場合、
先頭アドレスを指定すれば、
先頭アドレス以上(先頭アドレス+4)未満が、
割り当てられているメモリ領域と判断してくれるのです。
次話では、2次元配列に対応するポインタについて考えます。
第5話へ 第7話へ
第2部目次に戻る 第1部目次に戻る
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ