gpt4 book ai didi

c++ - 关于结构和指针的问题

转载 作者:行者123 更新时间:2023-11-28 01:10:16 24 4
gpt4 key购买 nike

让我们考虑下面的代码

#include <stdio.h>
#include <iostream>
using namespace std;
typedef struct bf_{
unsigned x:4;
unsigned y:4;
unsigned z:4;
unsigned w:4;
}bf;
int main(){
unsigned short i=8;
unsigned short j=9;
bf* bitfields=(bf *)&i;
bf*bit=(bf*)&j;
bitfields->w=12;
printf("%d\n",bitfields->x);
printf("%d\n",bit->y);
printf("%d\n",bitfields->w);



return 0;
}

这个片段

unsigned short j=9;
bf*bit=(bf*)&j;
printf("%d\n",bit->y);

例如,我在猜测这段代码后添加了一些有趣的特征 在这个地方之后

bf* bitfields=(bf *)&i;

当我们编写打印 8 的 printf("%d\n",bitfields->x); 时,我明白使用指针和引用 i 的值将被授予 x,因此它打印8 例如当我们写 bitfiled->y 它写 0 所以我决定引入第二个元素变量 j 创建 bf structer 的新实例并在之后引用 j语句 bit->y 应该写 9 因为据我了解它是顺序定义但它给了我 0 为什么?请解释一下这段代码是如何工作的?我不会说英语所以请原谅我的英语不好

最佳答案

首先,这段代码中没有使用引用。 & 字符,当用作一元运算符(而不是作为类型名称的一部分)时,如在此上下文中,表示“address-of”。所以&i是“i的地址”,不是“对i的引用”。

我不确定您是从哪里想到使用值 9 作为您的 bf 结构应该导致 y 获得值 9。当你这样写时:

bf* bitfields=(bf *)&i;

实际情况是您告诉编译器“将内存位置 &i 的值视为一个 bf 结构”。 bf 结构的定义是,从最低有效位(最右边)开始,前四位是 x 值,后四位是 y值,后四位为z值等

所以由于&i处的值为8,而16位二进制中的8为

0000 0000 0000 1000 

bitfields 的字段将是:

0000 0000 0000 1000 
w z y x

因此 x(4 位无符号整数)的值为 8,而 yzw 为 0。

在你写的情况下

bf*bit=(bf*)&j;

你正在做与上面相同的事情,除了现在值是 9,所以赋值是:

0000 0000 0000 1001 
w z y x

所以x的值为9,其他值仍然为0。

如果要将值 9 分配给 y 而不是 x,分配需要如下所示:

0000 0000 1001 0000 
w z y x

因此您必须使用的值是具有 16 位二进制表示的值

0000 0000 1001 0000 

这是 144。所以如果您让 j = 144 而不是 j = 9,您会观察到 bit->y 是9,bit 中的所有其他字段均为 0。

关于c++ - 关于结构和指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3805043/

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