今天看了Programming in Objective-C 2.0 一书中 C语言基本特性部分的Struct结构体中对"位字段"的描述,起初光看书, 只觉得这个位字段仅仅是用于更加精确的控制字段存放的数据大小. 在后来看到可以为结构体指定一个没有名称的字段作为跳过字中的某些位, 或都指定一个无名且长度为0的字段作为单位边界的开始点. 就开始觉得是否这些位字段在内存的位置是以位为单位连在一起作为一个整体. 后来动手写了程序来验证我的猜想(说实在书上讲得很不清楚的啊,还是翻译的问题?).
int main(void) {
struct x_entry {
unsigned int type:2;
unsigned int :2; //跳过int中的2个位
unsigned int omg:4;
unsigned int :0; //作为位边界, 下面的字段会存放到下一个int中
unsigned int newBit:2;
}
struct x_entry s_entry;
unsigned int *prt = (unsigned int*) &s_entry; //这里将prt指向s_entry,所以可以把一个整数值设置给prt指向的位置, 最终可以看出位字段在内存中的关系.
*prt = 35 ; // 35 = 0010 0011
printf("s_entry.type=%i, s_entry.omg=%i\n", s_entry.type, s_entry.omg); //结果为s_entry.type=3,s_entry.omg=2 这是在我的机器上的结果,赋值顺序是从左到右
//这里对prt下一位进行操作,将操作到newBit的内存,原因是因为那个0长度的无名字段.
*(prt + 1) = 3; // 3= 0000 0011
printf("s_entry.newBit=%i", s_entry.newBit); //值为3
}
从这里可以看出我们 当将一个整数值赋值给这种结构体时, 对位字段的作用就显现出来了.
但我想不通这个在哪里将会用得上,这是非常容易出错而且可读性很不好的一种赋值
分享到:
相关推荐
深入解析task_struct 结构体的几个字段
通过上述介绍,我们可以看到C/C++结构体的位字段功能提供了一种灵活的方式来控制内存的使用。合理地使用位字段不仅可以节省内存,还可以提高代码的可读性和效率。然而,需要注意的是,正确地使用位字段需要对底层...
接下来,我们需要一个排序函数,它接受一个指向结构体数组的指针、数组长度以及一个排序依据的字段名。我们可以使用`strcmp()`函数来比较字符串字段,对于整型字段可以直接使用比较运算符。这里以冒泡排序为例,但你...
搜索字段(AStruct) - 显示结构数组 AStruct 中的所有字段及其完整(“长”)名称。 搜索字段(AStruct,SearchString) - 显示结构数组 AStruct 中名称包含 SearchString 的所有字段(默认 = 不区分大小写)。 ...
`struct2string`函数遍历结构体的字段,包括嵌套的结构体和数组,然后生成相应的MATLAB代码字符串。它会处理各种数据类型,如数值、字符串、逻辑值、数组以及复杂的数据结构,如元胞数组和结构体数组。对于每个字段...
`struct2cell`将结构转换为元胞数组,而`fieldnames`返回结构中所有字段的名字。通过结合使用这两个函数,我们可以遍历结构数组,检查每个结构是否包含指定的字段,如果包含,则提取其值。 下面是一个简单的示例,...
### Linux系统中的`struct flock`结构体 在深入解析`struct flock`之前,我们需要了解它在Linux系统中的重要性以及其在嵌入式开发领域的应用。`struct flock`是Linux内核提供的一种文件锁机制,主要用于实现进程间...
在这个例子中,我们定义了一个结构体 struct send_info,包含了发送者 ID、接收者 ID、消息主体的长度和消息主体等信息。 在发送端,我们需要将结构体转换成字符串,然后用 send 函数发送。在接收端,我们需要将...
`Go-autoflags`是一个非常有用的库,它可以帮助开发者自动从结构体字段生成对应的命令行标志,从而简化了命令行接口的创建过程。这个库大大减少了手动编写命令行解析代码的工作量,使代码更加简洁和易于维护。 `Go-...
在Javolution中,你可以使用`org.javolution.io.Struct`类来创建结构体的Java表示。例如,假设我们有一个简单的C结构体: ```c struct MyStruct { int id; char name[32]; }; ``` 在Java中,我们可以这样表示: ...
`struct2double`函数的作用是将结构体中的所有数值字段(即包含数值而非字符串或其他非数字类型字段)转换成双精度浮点数。如果某个字段不是数值类型,该函数会跳过它。对于包含子结构的结构体,`struct2double`会...
该dll库通知pdb文件分析结构体字段位置,并根据类型格式一个完整字符串,极大降低了开发者工作量。 1、可通过cdump\Release\cdumpTest.exe 查看执行结果 2、windows xp 以上系统均支持 3、基础版只提供32位,支持的...
#### 五、结构体字段的动态访问 在某些情况下,可能需要在运行时动态地访问结构体的字段。MATLAB支持使用动态字段名来实现这一功能。例如: ```matlab fieldName = 'name'; name = person.(fieldName); ``` 这种...
在Android开发中,结构体(Struct)是一种非常重要的数据组织形式,它允许开发者自定义复杂的、包含多个数据类型的组合体。结构体定义通常用于在不同的组件之间传递数据,尤其是在网络通信,如向服务器发送或接收...
在C++编程语言中,结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的变量组合成一个单一的实体,使得数据管理更加方便。结构体是C++中实现数据封装的一种基本方式,尤其对初学者来说,理解并熟练运用...
通过JSON编码和解码的方法实现简单,执行效率较高,尤其是在结构体字段类型简单且不需要对字段进行额外处理的情况下。然而,这种方法在处理一些特定类型时(如time.Time、interface{}等)可能需要额外的处理逻辑,...
结构体由字段和对应的值组成,每个字段可以是不同的数据类型。MATLAB 提供了两种定义结构的方式:直接应用和使用 struct 函数。 1. 直接应用方式 直接应用方式是指在 MATLAB 中直接使用点号来定义结构体的字段和值...
两个结构体(可能类型一样), 字段名和类型都一样, 想复制一个结构体的全部或者其中某几个字段的值到另一个(即merge操作), 自然想到可以用反射实现. package main import fmt import reflect // 用b的所有字段覆盖a的 ...
为避免这种情况,可以先备份工作空间中的变量,或者更改结构体字段的名称。 - **数据类型**:`struct2vars`仅处理标量结构体,不适用于结构体数组的每一行或每一列。若需处理结构体数组,可以先通过循环或其他方法对...
在`struct2strrecursive`中,函数首先处理结构体的顶层字段,然后对每个字段进行检查,如果字段本身也是一个结构体,则再次调用函数自身,直到所有子结构都被展开成字符串。 `struct2strrecursive`的实现可能包括...