gpt4 book ai didi

c - 我无法理解这种类型转换

转载 作者:行者123 更新时间:2023-12-04 12:25:50 25 4
gpt4 key购买 nike

我用 intchar 做了类型转换,但没有用指针,所以我发布了这个问题。

#include <stdio.h>
int main() {
int a[4] = { 1, 2, 6, 4 };
char *p;
p = (char *)a; // what does this statement mean?
printf("%d\n",*p);
p = p + 1;
printf("%d",*p); // after incrementing it gives 0 why?
}

第一次调用 printf 给出数组的第一个元素。在 p=p+1 之后它给出 0。为什么?

最佳答案

让我们想象一个相当典型的平台,其中一个字节是八位,内存使用小端字节顺序排列,int 表示内存中的四个字节。在此平台上,值 1 的布局如下:

00000001 00000000 00000000 00000000
^
the first element of 'a'

p 声明为指向 char 的指针(不是 int),并初始化为指向数组 的第一个元素>一个。此平台上的 char 代表一个字节。上面解释为 charint 值看起来像这样:

00000001 -------- -------- --------
| |
------
char is only 8 bits wide

因此,无论我们读取一个字节还是四个字节,即无论我们读取*p还是a[0],该值都是1。但是,当您增加指向 char 的指针 p 时,它现在指向内存中的下一个 char,即下一个字节:

00000001 00000000 00000000 00000000
00000001 00000000 -------- --------
^ ^ ^ ^
p p+1 p+2 p+3 ...

a[1]指向下一个int(2),p[1]指向下一个 char,即 0


附带说明一下,您实际上偶然发现了一种方法来确定给定处理器是使用小字节序还是大字节序。如果系统是 big-endian(最重要的字节在前)那么你的第一个 printf 会打印 0。这是因为内存布局会改变:

0000000 00000000 00000000 00000001
^
the first element of 'a'

0000000 -------- -------- --------
^
p

如果您有多个按大端顺序排列的表示值 1 的字节,并且您只读取第一个字节,则可以使用它的值(10) 来测试机器的字节顺序:

int n = 1;
if(*(char*)&n == 1)
// little endian
else
// big endian

关于c - 我无法理解这种类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814569/

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