• 締切済み

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

  • 0256
  • お礼率54% (13/24)

みんなの回答

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

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

0256
質問者

お礼

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

  • notnot
  • ベストアンサー率47% (4848/10262)
回答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

  • c

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } (0x%2X)数字でしょうかなんでしょうか わかりません 助けて下さい

  • c++

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } if((1-'!'+1)%4==0はどういう意味でしょうか

  • borlandについてなんですが

    windows vista にBorland C++ Compiler 5.5をインストールし、説明が書いてあるサイトどおりに設定したんですけど、コンパイルすると エラーE2209 hello.c 1:インクルードファイル'stdio.h'をオープンできない 警告 W8065 hello.c 5: プロトタイプ宣言のない関数'printf'の呼び出し(関数 main) と出てコンパイルすることができません。 使用したプログラムは #include <stdio.h> int main(void) { printf("Hello.\n"); return 0; } です。 解る方いましたら教えてください。 よろしくお願いします。

  • AIZU ONLINE JUDGEについて

    明らかに正常なコードなのに答えが間違っているとされます。 #include<stdio.h> int main(void) { int a, b, c, N, i; scanf("%d",&N); for (i = 0; i < N; i++) { scanf("%d %d %d", &a, &b, &c); int A = a*a; int B = b*b; int C = c*c; if ((A + B == C) || (B + A == C )|| (C + A == B)) { printf("YES\n"); } else { printf("NO\n"); } } return 0; } これはvisual studio では通りました。 ちなみにこのコードは自分のものと酷似していますが、これはAIZU的にはOKだそうです。 #include <stdio.h> int main(void) { int a, b, c, n, i; scanf("%d",&n); for (i = 0; i < n; ++i) { scanf("%d %d %d", &a, &b, &c); if ((a*a + b*b == c*c) || (b*b + a*a == c*c) ||( c*c + a*a == b*b)) printf("YES\n"); else printf("NO\n"); } return 0; } この違いはなんでしょうか?

  • borlandについて

    こんばんは Borland C++ Compiler 5.5 を使っているのですが… _______________ |#include <stdio.h>      |←のようなプログラムをコンパイル |               | したら |int main(void) |1:インクルードファイル'stdio.h'を |{              | オープン出来ない | printf("Hello.\n");   |5:プロントタイプ宣言のない関数 | return 0;        | 'printf'の呼び出し(関数mein) |}              |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ と出てきますどうしたらよいでしょうか。

  • UnixでC言語を学習中(初心者です)。

    こんにちは。C言語の学習を始めたばかりの社会人です。 下記のソースコードを実行すると、 「009e 10  00a2 35 00a6 25 00aa 67 00ae 88 00b2 29」 というイメージ表示されるはずなのですが、アドレスが別な値になるのは仕方ないとして、アドレスを4桁で表示しようとしても7桁くらいで表示されてしまいます。Unixサーバを使用しています。 どうすればよろしいでしょうか? ご回答頂ければありがたいです。 #include<stdio.h> int main() { static long a[]={10L,35L,25L,67L,88L,29L,-999L}; long *pa; pa=a; while(*pa!=-999L){ printf("%04x %ld\n",pa,*pa); pa++; } printf("\n"); return 0; }

  • すいません 助けてください

    #include <stdio.h> int main(void) { int a, ##########; int ##########; int vc[]={1,2,3}; a= 10; ptr = &a; b= *ptr; c=&vc[1]; printf("*ptr のデータ =###\n", ####); printf("*ptr のアドレス=####\n", ####); printf("bのデータ =####\n", ####); printf("bのアドレス=####\n", ####); printf("vc[1]のデータ=####\n", ####); printf("vc[1]のアドレス=####\n", ####); printf("cのデータ=###\n", ###); printf("cのアドレス=####\n", ####); return (0); } #の部分がわかりません 教えてください><

  • c

    ¥bとはどういうときに使うのでしょうか たとえば /*arry02*/ #include<stdio.h> int main() { int a[]={1,2,100,50}; int i; for(i=0;i<4;i++) printf("a[%d]=%d,",i,a[i]); printf("\b\b \b\n"); return0; } の場合バックスペースで2つ戻りとあります どこをどう戻っているのかさっぱりです 戻った位置もどこなのかわかりません たすけてください

  • C言語のポインタについての質問です。

    C言語のポインタについての質問です。 2つのプログラムを作り、片方で数値を入力し、 もう片方でその数値を読み取りたいと思っています。 数値入力のプログラムは次のようになっています。 #include<stdio.h> void main(void){ int A=1; int *p; p=&A; printf("%p\n",p); } この実行結果は「0012FF88」となりました。 次にこの「0012FF88」というアドレスを使って「1」を読み取る 別のプログラムを作りたいと思っています。 #include<stdio.h> void main(void) { int add; int a; printf("アドレスは?\n"); scanf("%x",&add);    //「0012FF88」と入力 a=*(int*)add; printf("%x---->%d",&add,a); } このようなプログラムを作ってコンパイルできたのですが、 実行してアドレスを打ち込むと「Win32の例外が発生しました」 となって実行できません。 何かよい方法やプログラムの問題などありましたら 教えて頂けませんか?

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }