Code前端首页关于Code前端联系我们

关于C中结构体成员变量访问方法的一些思考

terry 2年前 (2023-09-25) 阅读数 48 #后端开发

本文主要讲C中结构体成员变量访问方法。结构体成员变量访问?这么简单的问题该怎么想呢?非常困惑和奇怪。既然如此,我们就带着这个奇怪的问题继续往下看吧。示例 案例1

如果程序中定义了struct node_t类型的变量node如下:

struct node_t node;

那么我们可以直接访问成员变量c,如下:

node.c

案例2

如果程序中定义的指针p_node是struct node_t类型,如下:

struct node_t node;
struct node_t *p_node = &node;

或者struct node_t类型的内存在堆上分配如下:

struct node_t *p_node= (struct node_t *)malloc(sizeof(struct node_t));

对成员变量c的访问方法如下:

p_node -> c;

案例3

以上两种接入方式比较常见,大家都知道。我们来讨论一个大家都不是特别熟悉,也不是很常见的。情况:

如果程序中只输入一个addr_node内存地址值,且从addr_node开始的内存地址指向struct node_t类型的内存,则addr_node声明如下:

unsigned long addr_node;

目前如何访问成员变量c根据这个内存地址?

既然我们知道addr_node结构体的起始地址,我们重新输入它就可以得到指向该结构体的p_node指针:

struct node_t *p_node = (struct node_t *)addr_node;

接下来,我们可以通过case 2来访问成员变量c;

情况3的意义在于我们可以通过特定的内存地址值访问我们的结构体成员变量;

关于案例3的一点解释

为什么要特别指出案例3?因为我们在之前关于C语言结构体位移的博文中使用了类似的用法:

((struct node_t *)0)->c

我们通过内存地址0的node_t体的成员变量c来访问该结构体,但是有几点需要说明一下:

1.我们没有对内存地址 0 执行任何与内存相关的操作,例如取消引用、分配等。 j。内存地址从0开始。内存部分没有变化;

2。我们只使用编译器函数来帮助我们计算结构位移;

3。善于利用编译器的一些特性来优化我们的程序或系统;

结论

本文主要介绍C中访问结构体成员变量的几种方式,通过内存地址值直接访问结构体。对body成员变量进行了解释,解释了上一篇博文中可能出现的一个问题。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门