- 締切済み
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
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
>プログラムを書き換えましたのでもう一度みてください。 a[4]の次に、b が来ているという結果だと思います。 念のためですが、int a[5]; という宣言は、 a[0]、a[1]、a[2]、a[3]、a[4] という5つの領域を確保するという意味だと言うことは理解されてますよね?
- notnot
- ベストアンサー率47% (4900/10358)
いいのかどうかはあなたの意図次第です。 プログラムは書かれたとおりに正しく動いています。 ループの中で、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 #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
お礼
何度もご親切に有難う御座いました。エクセルの事も、聞いても いいでしょうか。 それは、次のような現象です。 ここに エクセル の データ を コピー したのですけど 忠実ではありませんでした。今から勉強して、新たに 質問します。 よろしくお願いします。0256