据我所知,'&'运算符,它返回内存中操作数的基址。
让我们想象下面的场景(就像在我的机器上一样):
现在,如果我写这样的话:
void main() {
int i = 5411;
int *ip = &i;
char *c = &i;
printf("%d",*ip);
printf("%c",*c);
}
第一个printf()应该给我5411.谈到第二个printf(),i的基地址包含10101001(高阶8位= 1字节用于char类型指针)。 因此* c应该给我169,转换为%c时是无效字符。
但是编译器给了我'#'或其他一些有效的输出。为什么会这样?有什么输入吗?
编辑(取自作者对其中一个答案的评论):
这只是一个虚拟案例,因为我离开了实际的机器。
实际情况是i = 5411
答案 0 :(得分:24)
您似乎无法理解整数如何存储在内存中。以5411为例。
5411 = 1010100100011
然而,这个数字为13的二进制数字,因为int
是32位,所以它必须填充到32位
5411 = 00000000 00000000 00010101 00100011
在小端机器上(默认为x86,ARM),最低有效字节存储在前面,所以在内存中:
00100011 00010101 00000000 00000000
^
c c + 1 c + 2 c + 3
ip
因此,*c
应返回00100011,即35('#'
)。
答案 1 :(得分:5)
ASCII只定义最多127个字符。除此之外,您真正要做的是打印与*c
中的值对应的数字,这也是使用%d
...
printf("%d",*c);
...应该按照您的预期显示数字。
答案 2 :(得分:3)
首先,你的程序是不正确的。 C和C ++都不允许使用char *
值初始化int *
指针。在初始化c
指针时需要显式强制转换。
其次,原始整数i
的哪个字节 - 更高阶或更低阶 - 驻留在其“基地址”是实现定义的。有小端架构,其中较低的顺序,但将通过*c
(在8位130
计算机上具有值char
而不是114
看到)。还有大端架构,其中高阶但通过*c
(在8位0
机器上为char
)可以看到。因此,您应该期望使用代码130
的字符或代码为0
的字符打印%c
格式说明符。
第三,在典型的实现中,通常没有“无效字符代码”这样的东西。对于任何代码,通常会以某种方式打印某些代码。我不知道你是如何设法获得#
作为代码的输出。这是您运行的真实代码吗?
答案 3 :(得分:1)
* c的地址是i的地址,因为你已将c分配给& i。然后它将取最高或最低(取决于endian)并打印该字符。
答案 4 :(得分:1)
要了解整数的编码,你应该尝试一下并做
printf("0x%X, %X|%X|%X|%X\n",
i,
i & 0xFF,
(i >> 8) & 0xFF
(i >> 16) & 0xFF
(i >> 24) & 0xFF
);
然后使用c[0]
,c[1]
等以及其他格式字符串%c
执行相同操作。