C言語ポインタのプログラムの実行結果が予想と異なる

このQ&Aのポイント
  • C言語のポインタを使ったプログラムの実行結果が予想と異なる。
  • プログラムの実行結果が「9 6 5」と表示されるが、予想では「6 9 5」となるはず。
  • プログラムの処理の流れを順番に解説してほしい。
回答を見る
  • ベストアンサー

C言語 ポインタ

以下の問題について質問です。 次のプログラムを実行すると、画面にどのように表示されるかを書け。 #include <stdio.h> int main(void){ int s=2, t=3, u=7; int *q=&s, *p=&t, *h; u-=*q; *q=*p; *p=u+1; h=p; p=q; q=h; *p+=*q; printf("%d %d %d\n",s,t,u); return 0; } これで、9行目までにq=3,p=6,u=5になって、10~12行目でqとpの値を交換してるから、実行結果は 6 9 5 になるかと思ったのですが、実際に動かしてみると 9 6 5 と表示されました。 どこで間違えているのかが分からないので、上から順にどういう処理が行われているのかを書いていただけるとありがたいです。

noname#232884
noname#232884

質問者が選んだベストアンサー

  • ベストアンサー
  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.1

u-=*q;  ⇒ u = u - s と等価 u は 5 になる *q=*p;  ⇒ s = t と等価 s は 3 になる *p=u+1;  ⇒ t = u + 1 と等価 t は 6 になる h=p;   ⇒ ポインタのみコピー(a) p=q;   ⇒ ポインタのみコピー(b) q=h;   ⇒ ポインタのみコピー(c) *p+=*q;  ⇒ s = s + t と等価 s は 9 になる (a), (b), (c) のポインタのコピーを繰り返すことで、 *q が t を指し、*p が s を指すようになります。 このポインタのコピーがこの問題のキモですね。

noname#232884
質問者

お礼

回答ありがとうございました。 理解できましたm(__)m

関連するQ&A

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • 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の例外が発生しました」 となって実行できません。 何かよい方法やプログラムの問題などありましたら 教えて頂けませんか?

  • ポインタいついて教えてください

    ポインタがわかりません。 教えてください。 下の二つは、共に「100」を表記すると思いますが、 どこがどのように違うのですか。 また、f1()という関数をつくって、ここで scanfを使って、5つぐらい値を代入させて、 他の関数でこの値を使おうと思っています。 この場合下のどちらを使うのが、よろしいのでしょうか。 よろしくお願いします #include <stdio.h> int main(void) { int *p, q; q = 100; /* q に100を代入 */ p = &q; /* p にq のアドレスを割り当てる */ printf("%d", *p); return 0; } #include <stdio.h> int main(void) { int *p, q; p = &q; /* q のアドレスを得る */ *p = 100; /* ポインタを使ってq に値を代入する */ printf("%d", q); return 0; }

  • C++ ポインタ初級

    C++で、自作関数内でメインの数字をインクリメントします。 自作関数はVOIV型でやりたいんです。 #include <stdio.h> void plus( int * ); main( ){  int a = 1;  int *&p = &a;  plus( p );  printf( "%d" , *p ); } void plus( int *i ){  ( *i )++; } int型の変数を2つ宣言したけど、1つでやる方法はないですか? #include <stdio.h> void plus( int * ); main( ){  int a = 1;  plus( &a ); // aのアドレスを渡して、  printf( "%d" , a ); } void plus( int *i ){ // アドレスの値を  ( i )++; // インクリメントしたつもりだけど } 結果は1のままでした。

  • c言語についてですが

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define D_ABC 50 #define S_NUMBER 5 int main( void ) { int abc[ D_ABC ]; int goukei; int homi; int sa[S_NUMBER]; int s; int m; int p; int k; s = 0; printf( "指定する数値を入力して下さい。\n"); do{ scanf( "%d", &sa[s++] ); } while(sa[s-1] > 0 ); --s; p = 0; printf( "指定する数字を入力して下さい。\n" ); do{ scanf( "%d", &abc[p++] ); } while( abc[p - 1] > 0 ); --p; srand( time(NULL)); for( m = 0; m < 5; m++ ) { do{ for( k = 0; k < 100; k++ ) { int o = rand() % p; int t = rand() % p; int buf; buf = abc[o]; abc[o] = abc[t]; abc[t] = buf; } goukei = 0; homi = 0; for( k = 0; k < 5; k++ ) { goukei += abc[k]; if( ( abc[k] % 2 ) == 0 ) ++homi; } } while( goukei < (50 - [sa] || goukei > (110 - [sa]) || homi < 2 || homi > 3 ); for( k = 0; k <4; k++ ) printf( "%d%d\t",sa[s], abc[k] ); printf( "\n" ); } return 0; } どこか おかしいですか? 始めたばかりなのでわかりません。

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • c言語についてですが

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define D_ABC 50 #define S_NUMBER 5 int main( void ) { int abc[ D_ABC ]; int goukei; int homi; int sa[S_NUMBER]; int s; int m; int p; int k; s = 0; printf( "指定する数値を入力して下さい。\n"); do{ scanf( "%d", &sa[s++] ); } while(sa[s-1] > 0 ); --s; p = 0; printf( "指定する数字を入力して下さい。\n" ); do{ scanf( "%d", &abc[p++] ); } while( abc[p - 1] > 0 ); --p; srand( time(NULL)); for( m = 0; m < 5; m++ ) { do{ for( k = 0; k < 100; k++ ) { int o = rand() % p; int t = rand() % p; int buf; buf = abc[o]; abc[o] = abc[t]; abc[t] = buf; } goukei = 0; homi = 0; for( k = 0; k < 5; k++ ) { goukei += abc[k]; if( ( abc[k] % 2 ) == 0 ) ++homi; } } while( goukei < (50 - [sa] || goukei > (110 - [sa]) || homi < 2 || homi > 3 ); for( k = 0; k <4; k++ ) printf( "%d%d\t",sa[s], abc[k] ); printf( "\n" ); } return 0; } このようなソースプログラムを書いてみたんですがうまくいきません。 最初の数値はS_NUMBER からの入力で後に通ずく数値はシャッフルした数値を入力したいとおもっていますがうまくいきません。どなたかお願いします。      〇  ●●●●(イメージです)

  • C言語の初歩的な質問

    質問1----------------------------------------- #include<stdio.h> int main() {  int a;  char b[10];  for(int i = 0;i < 2;i++){   scanf("%d",&a);   printf("整数%d\n",a);  }  scanf("%s",b);  printf("文字列%s\n",b); } /* この際に、例えばabと入力すると結果が 整数-858993460 整数-858993460 文字列ab となり整数入力を無視して進められるのはなぜでしょうか? */ 質問2----------------------------------------- #include<stdio.h> void func(int**); int main() {  int *p;  func(&p);  printf("%d",*p); } void func(int **pp) {  int n = 10;  *pp = &n; } /* func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? */ ---------------------------------------------- C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

  • C言語 プログラミング

    C言語、プログラミングの質問です。 構造体について、 プログラムを組んでみたのですが、上手く出力されません。実行時にはエラーはないのですが、出力時に上手くいきません。どなたかどこがおかしいかわかる方、教えていただけませんでしょうか? #include <stdio.h> struct user{ char *name; char *id; int books; }; int main (void) { struct user u; printf("氏名を入力して下さい。"); scanf("%s",u.name); printf("パスワードを入力してください。"); scanf("%s",u.id); printf("年齢を入力してください。"); scanf("%d",&u.age); printf("氏名 %s\n",u.name); printf("パスワード %s\n",u.id); printf("年齢 %d\n",u.age); return 0; } よろしくお願いします。

  • C言語のポインタの考え方について

    ポインタについて理解ができていないのでお聞きしたいのですが 値を交換する関数のプログラミングでこの場合ポインタ で以下にしないといけないと思います。 #include<stdio.h> void swap(int *a int *b){ int c; c=*a; *a=*b; *b=c; } main(){ int x,y; x=123; y=456; swap(&x,&y); printf("x = %d, y = %d\n", x, y); } またポインタを使用せず以下のプログラムではなぜダメのでしょうか。 よろしくお願い致します。 #include<stdio.h> void swap(int a int b){ int c; c=a; a=b; b=c; } main(){ int x,y; x=123; y=456; swap(x,y); printf("x = %d, y = %d\n", x, y); }

専門家に質問してみよう