根据我对'&'运算符的了解,它返回内存中操作数的基址 .
让我们想象下面的场景(在我的机器上):
-
sizeof(int)= 4个字节
-
sizeof(float)= 4个字节
-
sizeof(char)= 1个字节
现在,如果我写这样的东西:
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时是无效字符 .
但是编译器给了我'#'或其他一些有效的输出 . 为什么会这样?有什么输入?
EDIT (取自作者对其中一个答案的评论):
那只是一个虚拟案例,因为我离开了实际的机器 . 实际情况是i = 5411
5 回答
您似乎无法理解整数如何存储在内存中 . 以5411为例 .
然而,这个13位二进制数字,因为
int
是32位,它必须填充到32位在一个小端机器上(默认情况下为x86,ARM),最低有效字节存储在前面,因此在内存中:
因此,
*c
应返回00100011,即35('#'
) .ASCII只定义了最多127个字符 . 除此之外,你真正想要做的是打印与
*c
中的值对应的数字,这也是使用%d
完成的......应该显示您期望的数字 .
首先,你的程序是不正确的 . C和C都不允许使用
int *
值初始化char *
指针 . 在初始化c
指针时需要显式转换 .其次,原始整数
i
的哪个字节 - 更高阶或更低阶 - 位于其"base address"是实现定义的 . 有小端架构,其中低阶但通过*c
(在8位char
机器上具有值130
,而不是114
)可以看到 . 并且有大端架构,其中高阶但通过*c
(在8位char
机器上是0
)可以看到 . 因此,您应该期望使用代码130
的字符或具有代码0
的字符使用%c
格式说明符进行打印 .第三,在一个典型的实现中,'s normally no such thing as 693107 . For any code something will usually be printed in one way or the other. I don't看到你如何设法获得
#
作为代码的输出 . 这是你运行的真实代码吗?只是为了了解整数编码的一些内容,你应该尝试一下并做
然后使用
c[0]
,c[1]
等以及其他格式字符串%c
执行相同的操作 .