问题
在书中看到这样的描述:
我们按照这个来操作一下:
代码
#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
跟我们期望中有点不一样,我们希望他的结果是:a = a b = d
,为什么会这样呢 ?
解答
这跟a
b
在内存中的地址是有关的
我们先看一下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
的位置如下图所示,一个地址(1个字节)存一个字符:
把字符读进a的时候
从左到右读入:
读入a
分别将字符a
, b
, c
写进~cc
,~cd
,~ce
里面
把字符读进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<stdio.h>
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
没错,就是这样。
网友评论