整数0 强制转化为指针

这篇具有很好参考价值的文章主要介绍了整数0 强制转化为指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在工程中看到以下代码:

#define my_container_of(ptr,type,member) \
((type*)((char *) (ptr) - (unsigned long)(&((type*)0)->member)))                      

->的优先级高于&。 因此 &((type*)0)->member)的解释为先进行:
(type*)0)->member 取得member成员的运算,然后再进行取地址& 运算

举例测试:

#include <stdio.h>                       
int main(void) 
{
  typedef struct{ 
	int a; 
	char b; 
  }Msg; 

  Msg my_var = {0}; 
  printf("addres of my_var = 0x%x\n",&my_var); 
  printf("(unsigned long)(&((Msg*)0)->b) = 0x%x\n",(unsigned long)(&((Msg*)0)->b)); 
  printf("address = 0x%x\n",(Msg*) ((char*)(&(my_var.b)) - (unsigned long)(&((Msg*)0)->b))); 
  printf("address of a = 0x%x\n",&(my_var.a)); 
  return 0; 
}

得到如下结果:
整数0 强制转化为指针,c语言
总结:
通过上述例子了解该代码目的:
1、(unsigned long)(&((Msg*)0)->b))获取结构体成员b 相对于结构体地址首地址的偏移量,然后通过获取自定义结构体变量my_var 中成员b的地址,减去b 相对于结构体首地址的偏移量,从而获取到结构体my_var的首地址。
应用:文章来源地址https://www.toymoban.com/news/detail-618809.html

struct my_slist_node                                                               
{
    struct my_slist_node *next;    
};
typedef struct my_slist_node my_slist_t;                /**<  single list. */ 
struct my_struct                                
{
    const char *name; 
    uint32_t consumer_num;   
    osMutexId_t lock;  
    my_slist_t consumer_slist; 
    my_slist_t slist;     
};

static my_slist_t  my_root = {0}; 
如果my_root为首节点的 链表中保存着每个my_struct 变量中成员变量  slist 的地址,这样就可以通过该方法获取到每个my_struct 结构体变量的首地址,从而访问其结构体成员。                                                             

到了这里,关于整数0 强制转化为指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言(强制类型转换)

    创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~ 一.类型转换原则 1.升级:当类型转换出现在表达式时,无论时unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与

    2024年02月16日
    浏览(35)
  • C语言强制类型转换

    C语言中的强制类型转换是指将一种数据类型转换为另一种数据类型的过程。强制类型转换可以显式地将一个数值从一种数据类型转换为另一种数据类型,但是需要注意的是,该转换可能会导致数据精度的丢失。下面是C语言中强制类型转换的实际代码示例: 在上述代码示例中

    2024年02月04日
    浏览(40)
  • C语言编程—强制类型转换

    强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用 强制类型转换运算符 来把值显式地从一种类型转换为另一种类型,如下所示: 请看下面的实例,使用

    2024年02月11日
    浏览(37)
  • C语言入门教程||C语言 头文件||C语言 强制类型转换

    头文件是扩展名为  .h  的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令  #include  来引用它。前面我们已经看过  stdio.h  头文件,它是编译

    2024年02月02日
    浏览(40)
  • c语言和cpp里面的强制类型转换

    强制类型转换格式如下: (新类型名)变量名 1 int a =1; double b=10.0; b=(double)a; 2.  c++的强制类型转换 dynamic_cast类型 static_cast类型 auto_cast类型 运行识别和强制内存管理 3.宏定义或者“宏替换” #define 标识符 常量 #define pi 3.14  另一种定义常量的方法是使用const const 数据类型。变

    2024年02月02日
    浏览(49)
  • 将一段C语言转化为Verilog

    有时需要先用C语言完成某些设计,通过成熟的仿真软件验证后再转化为Verilog代码  上面是一个将平方数开方的算法,将其转化为verilog代码        代码中重要的是,在C语言中,代码是顺序执行的,且可以把赋值语句加在循环的任何一个地方,因此本次循环可以使用本次循环

    2024年02月12日
    浏览(24)
  • 系统语言德语时浮点数转化问题

    游戏上线后,玩家反馈系统语言为德语时会有问题,经排查测试,发现是德语的浮点数转化,也就是float.parser对于德语来说会有问题。 在中国和英国,表示小数是用 小数点,即:0.123。但是在德国,表示小数则是用 逗号,即 0,123。德国的浮点数没有\\\".\\\"一说。float.Parse(“0.12

    2024年01月16日
    浏览(27)
  • MATLAB中mod函数转化为C语言

    有项目算法使用matlab中mod函数进行运算,这里需要将转化为C语言,从而模拟算法运行,将算法移植到qt。 语法 b = mod(a,m) 说明 b = mod(a,m) 返回 a 除以 m 后的余数,其中 a 是被除数,m 是除数。此函数通常称为取模运算,表达式为 b = a - m.*floor(a./m)。mod 函数遵从 mod(a,0) 返回 a 的

    2024年02月10日
    浏览(49)
  • MATLAB中isequal函数转化为C语言

    有项目算法使用matlab中isequal函数进行运算,这里需要将转化为C语言,从而模拟算法运行,将算法移植到qt。 语法 tf = isequal(A,B) tf = isequal(A1,A2,...,An) 说明 如果 A 和 B 等效,则 tf = isequal(A,B) 返回逻辑值 1 (true);否则,返回逻辑值 0 (false)。有关每种数据类型的等效性的定义,请

    2024年02月10日
    浏览(33)
  • 如何实现队列和栈的转化(c语言)

    文章目录 一. 什么是栈 二.什么是队列 三. 怎么把栈变成队列(力扣) 四. 怎么把队列变成栈(力扣) 总结 栈(stack)又名堆栈,它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素

    2024年04月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包