今回はこの章の一番の主題。配列とポインタの関係についてやります。
といっても、配列もポインタもあまり詳しくやってませんが、
そこら辺はどうかご了承ください(汗)#include <stdio.h> int main() { int data[3]={1,2,3}; /* data[0]=1,data[1]=2,data[2]=3 で初期化*/ int *p=data; /* &data[0] と同意*/ printf("data[0]=%d\t*p =%d\n",data[0],*p); /* '\t' はタブ*/ printf("data[1]=%d\t*(p+1)=%d\n",data[1],*(p+1)); printf("data[2]=%d\t*(p+2)=%d\n",data[2],*(p+2)); return 0; } ---------- 実行結果 ---------- data[0]=1 *p =1 data[1]=2 *(p+1)=2 data[2]=3 *(p+2)=3今までに見たことの無いような形が出てきましたね。
*(p+1) というのはどういう意味でしょうか。
それは次のプログラムで解ります。
#include <stdio.h> int main() { int data[3]={1,2,3}; int *p=data; printf("p =%d\t&data[0]=%d",p,&data[0]); printf("p+1=%d\t&data[1]=%d",p+1,&data[1]); printf("p+2=%d\t&data[2]=%d",p+2,&data[2]) return 0; } ------------------------------ 実行結果(環境によって異なります) ------------------------------ p =1245056 &data[0]=1245056 p+1=1245060 &data[1]=1245060 p+2=1245064 &data[2]=1245064pはdata[0]のアドレスと同値、p+1はdata[1]のアドレスと同値、
p+2はdata[2]のアドレスと同値です。
p+1 は一見、pの値に1を加算した値に見えますが、
実際にはint型のサイズの4が加算されています。
(p+2 は8が加算されます。)
最初のソースでは間接参照演算子を利用しているので、
ポインタの指し示すアドレスの位置にある値、すなわち、
data[0],data[1],data[2]の値が返されるわけです。
これらから解るように、配列とポインタは非常によく似たものです。
二つの大きな違いは、配列は作成時にメモリ上に必要な領域を確保するのに対し、
ポインタは1つのアドレスを記憶する分の領域しか確保しないということです。
それともう1つ、ポインタはポインタ自体の値を変動させることが出来るということです。