問題
在書中看到這樣的描述:
我們按照這個來操作一下:
代碼
#include
int main(int argc, char const *argv[])
{
char a, b;
scanf("%3c%3c\n", &a, &b);
printf("a = %c b = %c\n", a, b);
return 0;
}
輸入:
abcdefg
輸出:
a = e b = d
跟我們期望中有點不一樣,我們希望他的結果是:a = a b = d,為什麼會這樣呢 ?
解答
這跟a b在記憶體中的位址是有關的
我們先看一下a b的位址:
#include
int main()
{
char a, b;
printf("a = %p\nb = %p\n", &a, &b);
return 0;
}
輸出:
a = 0x7ffeebfb5bcb
b = 0x7ffeebfb5bca
a的位址值比b的大,說明a的位址在b的後面,也就是&a = &b + 1(&是取址符);
a b的位置如下圖所示,一個位址(1個位元組)存一個字元:
a b的位置示意
把字元讀進a的時候
從左到右讀入:
讀入a
分别将字元a, b, c寫進~cc,~cd,~ce裡面
把字元讀進b的時候
也是從左到右讀入
讀入b
分别将字元d, e, f寫進~ca,~cb,~cc裡面。
注意!
原本位址~cb裡面的a被新寫入的e覆寫
原本位址~cc裡面的b被新寫入的f覆寫
列印a、b
因為char a的位址是~cb, ~cb裡面現在是e
而char b的位址是~ca, ~ca裡面現在是d
輸出結果
所心輸出當然是:
a = e b = d
也可以驗證一下,輸出a位址右邊那個位址裡面的數,理論上應該是f
#include
int main(int argc, char const *argv[])
{
char a, b;
scanf("%3c%3c\n", &a, &b);
printf("a = %c b = %c a右邊那個字元是:%c\n", a, b, *(&a + 1));
return 0;
}
輸出結果:
a = e b = d a右邊那個字元是:f
沒錯,就是這樣。