gpt4 book ai didi

字符到整数指针转换

转载 作者:行者123 更新时间:2023-11-30 19:57:25 25 4
gpt4 key购买 nike

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();
}

我知道整数指针递增 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

请注意,内存保存的是二进制值。 Hex、Dec、Ascii 列只是同一二进制值的“人类” View 。

您的指针 s值为 base ,即它指向保存值 0100 0001 的内存位置(又名 A)。

然后你就创建 ptr指向base也是如此。

打印时(即 printf("%c %d\n",*(ptr+1),*(ptr+1)); ), ptr+1将指向一个取决于整数大小的位置(不同系统的大小不同)。由于 int 的大小为 2,ptr+1位置是base + 2 ,即0100 0011 (又名 C)。

所以这个声明的第一部分:

printf("%c %d\n",*(ptr+1),*(ptr+1));
^^ ^^^^^^^^

打印 C ,即位置 base+2 处的字符.

第二部分

printf("%c %d\n",*(ptr+1),*(ptr+1));
^^ ^^^^^^^^

打印位于 base+2 的整数值。 (注意 - 这是非法的,因为那里没有整数,但让我们暂时忘记这一点)。

就您而言int是两个字节。所以使用的字节将是 C (十六进制:0x43)和 D (十六进制:0x44)。打印的值取决于系统的字节顺序。

大端(MSB优先)将给出:

0x4344 which is 17220 in decimal

小端(LSB 在前)将给出:

0x4443 which is 17475 in decimal

因此,您的系统似乎是小端字节序。

正如你所看到的,很多东西都非常依赖于系统,从 C 标准的角度来看,不可能知道结果是什么。

关于字符到整数指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45779196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com