• 締切済み

borland bcc55

 次のプログラムと結果を見てください。 a[2]のアドレスと b のアドレスが同じなんですけど、これで、いいのですかね。宜しくお願いします。 0256  #include<stdio.h> main(){ int a[5]; int *pa; int i; int b; b=16; pa=a; for(i=0;i<6;i++){ *pa++=1000+i; printf(" a[%2d]=%x %x\n",i,*pa,pa); ++pa; printf(" &b=%x\n",&b); } return 0; } C:\Users\tadao\2015>2160 a[ 0]=7ffde000 18ff40 &b=18ff50 a[ 1]=1 18ff48 &b=18ff50 a[ 2]=10 18ff50 --------??????????????? &b=18ff50 ------------??????????????? a[ 3]=407cce 18ff58 &b=18ff50 a[ 4]=1c121c8 18ff60 &b=18ff50 a[ 5]=401000 18ff68 &b=18ff50

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

>プログラムを書き換えましたのでもう一度みてください。 a[4]の次に、b が来ているという結果だと思います。 念のためですが、int a[5]; という宣言は、 a[0]、a[1]、a[2]、a[3]、a[4] という5つの領域を確保するという意味だと言うことは理解されてますよね?

0256
質問者

お礼

何度もご親切に有難う御座いました。エクセルの事も、聞いても いいでしょうか。 それは、次のような現象です。  ここに エクセル の データ を コピー したのですけど 忠実ではありませんでした。今から勉強して、新たに 質問します。   よろしくお願いします。0256

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

いいのかどうかはあなたの意図次第です。 プログラムは書かれたとおりに正しく動いています。 ループの中で、pa は2回ずつインクリメントされ、一度目と二度目のインクリメントの間で、 printf(" a[%2d]=%x %x\n",i,*pa,pa); を実行しているので、 a[0] の後に表示されるアドレスは実際には a[1] のアドレス、 a[1] の後に表示されるアドレスは実際には a[3] のアドレス、 a[2] の後に表示されるアドレスは実際には a[5] のアドレス。 ところが、aは、a[0],a[1],a[2],a[3],a[4] までであり、a[5] は存在しないので、そこには b がありましたと言うことです。 メモリ上には、変数を書いた順で無く、 a[0] a[1] a[2] a[3] a[4] b i pa の順に置かれるようです(bcc32の場合。このあたりはコンパイラによる)。

0256
質問者

お礼

ありがとうございました。プログラムを書き換えましたのでもう一度みてください。よろしくお願いします。  0256  #include<stdio.h> main(){ int i; int a[5]; int *pa; int b; b=16; pa=a; printf("\n"); for(i=0;i<6;i++){ printf(" [%d]= %x %x\n",i,pa,&b); pa=pa+1; } return 0; } C:\Users\tadao\2015>2180 [0]= 18ff3c 18ff50 [1]= 18ff40 18ff50 [2]= 18ff44 18ff50 [3]= 18ff48 18ff50 [4]= 18ff4c 18ff50 [5]= 18ff50 18ff50

関連するQ&A

専門家に質問してみよう