void main()
{
char *s="ABCDEFG";
clrscr();
int *ptr=(int *)s;
printf("%c %d\n",*(ptr+1),*(ptr+1)); //OP :- C 17475
printf("%c %d\n",*(s+1),*(s+1)); //OP :- B 66
getch();
}
Run Code Online (Sandbox Code Playgroud)
我知道整数指针增加 2 个字节,而字符指针增加 1 个字节。这里当 int 指针增加 1 时,只打印 C(只考虑第一个字节)。是因为我们有 %c 说明符吗?
另外,我无法理解 17475 是如何作为输出打印的。在第二种情况下,66 是 B 的 ASCII 值。
有人能帮我吗?
首先,重要的是要注意您的代码具有未定义的行为。这意味着我们不能仅仅通过参考 C 标准来谈论生成的输出。输出可能/将因系统而异,某些系统甚至可能无法执行代码。
问题是您有多个char(一个char数组),但您使用int指针访问它。这是不允许的。
但是,在特定系统(您的系统)上,可以考虑为什么输出看起来如此。但请记住,它不是有效的 C 代码。 注意:正如 Antti Haapala 所指出的,代码语法是有效的 - 这只是未定义的程序行为
字符串(又名字符数组)将被放置在内存中的某处,例如:
Address | Bin | Hex | Dec | Ascii char
--------------------------------------------
base | 0100 0001 | 41 | 65 | A
base+1 | 0100 0010 | 42 | 66 | B
base+2 | 0100 0011 | 43 | 67 | C
base+3 | 0100 0100 | 44 | 68 | D
base+4 | 0100 0101 | 45 | 69 | E
and so on
Run Code Online (Sandbox Code Playgroud)
请注意,内存保存二进制值。Hex、Dec、Ascii 列只是相同二进制值的“人类”视图。
您的指针s具有 value base,即它指向保存该值的内存位置0100 0001(又名 A)。
然后你也ptr指出base。
打印时(即printf("%c %d\n",*(ptr+1),*(ptr+1));),ptr+1将指向取决于整数大小的位置(因系统而异)。由于 int 的大小为 2,因此ptr+1是 location base + 2,即0100 0011(又名 C)。
所以这个声明的第一部分:
printf("%c %d\n",*(ptr+1),*(ptr+1));
^^ ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
打印 a C,即位置处的字符base+2。
第二部分
printf("%c %d\n",*(ptr+1),*(ptr+1));
^^ ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
打印位于 的整数值base+2。(注意 - 这是非法的,因为那里没有整数,但让我们暂时忘记这一点)。
在你的情况下int是两个字节。所以使用的字节将是C(hex: 0x43) 和 (hex: 0x44 D)。打印的值将取决于系统的字节序。
大端(MSB 优先)将给出:
0x4344 which is 17220 in decimal
Run Code Online (Sandbox Code Playgroud)
小端(LSB 优先)将给出:
0x4443 which is 17475 in decimal
Run Code Online (Sandbox Code Playgroud)
所以从这里看来你的系统是小端的。
正如你所看到的,很多东西都非常依赖于系统,从 C 标准的角度来看,不可能知道输出会是什么。