問題
在書中看到這樣的描述:
我們按照這個(gè)來操作一下:
代碼
#include<stdio.h>
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
跟我們期望中有點(diǎn)不一樣报账,我們希望他的結(jié)果是:a = a b = d
,為什么會(huì)這樣呢 埠偿?
?
解答
這跟a
b
在內(nèi)存中的地址是有關(guān)的
我們先看一下a
b
的地址:
#include<stdio.h>
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
的位置如下圖所示冠蒋,一個(gè)地址(1個(gè)字節(jié))存一個(gè)字符:
把字符讀進(jìn)a的時(shí)候
從左到右讀入:
分別將字符a
, b
, c
寫進(jìn)~cc
,~cd
乾胶,~ce
里面
把字符讀進(jìn)b的時(shí)候
也是從左到右讀入
分別將字符d, e, f寫進(jìn)
~ca
抖剿,~cb
,~cc
里面识窿。注意!
原本地址
~cb
里面的a
被新寫入的e
覆蓋原本地址
~cc
里面的b
被新寫入的f
覆蓋
打印a斩郎、b
因?yàn)?code>char a的地址是~cb
, ~cb
里面現(xiàn)在是e
而char b
的地址是~ca
, ~ca
里面現(xiàn)在是d
所心輸出當(dāng)然是:
a = e b = d
?
也可以驗(yàn)證一下,輸出a
地址右邊那個(gè)地址里面的數(shù)喻频,理論上應(yīng)該是f
#include<stdio.h>
int main(int argc, char const *argv[])
{
char a, b;
scanf("%3c%3c\n", &a, &b);
printf("a = %c b = %c a右邊那個(gè)字符是:%c\n", a, b, *(&a + 1));
return 0;
}
輸出結(jié)果:
a = e b = d a右邊那個(gè)字符是:f
沒錯(cuò)缩宜,就是這樣。