字符到整数指针的转换

Zep*_*hyr -1 c pointers

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 值。

有人能帮我吗?

438*_*427 6

首先,重要的是要注意您的代码具有未定义的行为。这意味着我们不能仅仅通过参考 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 标准的角度来看,不可能知道输出会是什么。