Apple IDログイン機能メンテナンスのお知らせ

下に書いたプログラムを実行すると40が出力されるとおもったら、50が出力されました。なぜかおしえてください。(七行目までで*b=40になるところまではわかりました。
八行目でa=50としているものの、次の行でa = *bとあるのでa=40ではないかと考えました。)

#include <stdio.h>
int main(void){
int a = 10;
int *b;
a = a + 10;
b = &a;
*b = a + a;
a = 50;
a = *b;

printf("%d \n", a);

return 0;
}

A 回答 (5件)

int a; // aメモリを確保


int *b; // bメモリを確保
b = &a; // bメモリ ← aメモリの位置
a = 50; // aメモリ ← 50 の値
a = *b; // aメモリ ← (bメモリの内容)にあるメモリの内容

b=&a ならば、
(bメモリの内容)にあるメモリの内容
= (aメモリの位置)にあるメモリの内容
= aメモリの内容
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/04/28 00:57

>八行目でa=50としているものの


 *b は書き替えられて50になっているaを指している
わけで、この時点で 40 が代入された変数aはどこにも残っていないよ。
    • good
    • 0

途中


b = &a;
としているので b には a のアドレスが入る. つまりこれ以降 *b は a のエイリアスになる. そして
a = 50;
とあるので a は 50 になるわけだが, *b は a と同じなのでこの時点で *b も 50 になっている.
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/04/28 00:55

*bをaに置き換えたら理解できると思います。



以下は置き換えたソースコードです。

#include <stdio.h>
int main(void){
int a = 10;
int *b;
a = a + 10;
b = &a;
a = a + a;
a = 50;
a = a;

printf("%d \n", a);

return 0;
}
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/04/28 00:57

読むのも面倒な、変なプログラムですが、真ん中あたりで、



> b = &a;

こうしちゃってるので、b は aの参照になっちゃってますから、最後の

>a = *b;

これは、実質 a=a と同じような意味なんじゃないかと。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/04/28 00:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!