理解'&'运算符

Gau*_*lra 5 c c++

根据我对'&'运算符的了解,它返回内存中操作数的基址.

让我们想象下面的场景(就像在我的机器上一样):

  • 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);
}
Run Code Online (Sandbox Code Playgroud)

第一个printf()应该给我5411.谈到第二个printf(),i的基地址包含10101001(高阶8位= 1字节用于char类型指针).因此*c应该给我169,转换为%c时是无效字符.

但是编译器给了我'#'或其他一些有效的输出.为什么会这样?有什么投入?

编辑(取自作者对其中一个答案的评论):

那只是一个虚拟案例,因为我离开了实际的机器.
实际情况是i = 5411

ken*_*ytm 24

您似乎无法理解整数如何存储在内存中.以5411为例.

5411 = 1010100100011
Run Code Online (Sandbox Code Playgroud)

但是,这个13位二进制数字,因为a int是32位,所以必须填充到32位

5411 = 00000000 00000000 00010101 00100011
Run Code Online (Sandbox Code Playgroud)

在一个小端机器上(默认情况下为x86,ARM),最低有效字节存储在前面,因此在内存中:

00100011   00010101    00000000    00000000
^
c          c + 1       c + 2       c + 3
ip
Run Code Online (Sandbox Code Playgroud)

因此,*c应返回00100011即35('#').


Mar*_*iot 5

ASCII只定义了最多127个字符.除此之外,你真正想做的是打印对应于值的数字*c,这也是使用%d...

 printf("%d",*c);
Run Code Online (Sandbox Code Playgroud)

...应该显示您期望的数字.

  • @Gaurav - 你为什么期待169?在小端机器上,它应该是35.在大端机器上,它应该是0. (2认同)