container_of用法简述

本文详细解析了Linux内核中的container_of宏,该宏用于从结构体成员指针返回结构体指针。通过示例说明了如何使用此宏,这对于理解Linux驱动和内核编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://blog.sina.com.cn/s/blog_533074eb0101dn5a.html

 

在学习Linux驱动的过程中,遇到一个宏叫做container_of。
该宏定义在include/linux/kernel.h中,首先来贴出它的代码:

 

#define container_of(ptr, type, member) ({                      / 
const typeof( ((type *)0)->member ) *__mptr = (ptr);    / 
(type *)( (char *)__mptr - offsetof(type,member) );})

它的作用显而易见,那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。比如,有一个结构体变量,其定义如下:

struct demo_struct 
           type1 member1; 
           type2 member2; 
           type3 member3
           type4 member4; 
};      
struct demo_struct demo;
同时,在另一个地方,获得了变量demo中的某一个域成员变量的指针,比如:
      type3  *memp = get_member_pointer_from_somewhere();
此时,如果需要获取指向整个结构体变量的指针,而不仅仅只是其某一个域成员变量的指针,我们就可以这么做:
     struct demo_struct *demop = container_of(memp, struct demo_struct, member3);
这样,我们就通过一个结构体变量的一个域成员变量的指针获得了整个结构体变量的指针。

### JavaScript 中 DOM 的简介及基本概念 DOM(Document Object Model),即文档对象模型,是一种用于表示和操作 HTML 或 XML 文档的标准编程接口。它将整个文档建模为一个由节点组成的树形结构,使得开发者可以通过 JavaScript 动态地访问、创建、删除或修改文档中的任何部分[^1]。 #### 1. DOM 的核心作用 DOM 是连接 Web 技术的重要桥梁,它的主要职责在于提供一种统一的方式让程序能够与页面内容互动。具体来说: - **HTML 构造 DOM 结构**:HTML 文件会被浏览器解析成一棵 DOM 树,其中每个标签对应于该树的一个节点。 - **CSS 设定样式**:通过选择器匹配特定的 DOM 元素来应用相应的视觉表现规则。 - **JavaScript 控制行为**:允许脚本读取当前状态下的 DOM 数据,并对其进行更新以反映新的逻辑需求[^2]。 这种三者协作的关系构成了现代 web 开发的基础架构之一。 #### 2. 基础术语解释 为了便于理解和使用 DOM API ,有必要先熟悉以下几个关键术语: - **Node (节点)** : 所有东西——元素(Element), 属性(Attribute),文本(Text)等等 —— 都可以看作是一个 Node 。它们共同组成了完整的 Document Tree(文档树). - **Element (元素)** : 特指那些具有 opening 和 closing tags 的 component ,比如 `<div>`(`<p>`) 等等. - **Attribute (属性)** : 关联到某个 Element 上面的一些 key-value pair information . For instance,"class='container'" inside an html tag represents one attribute named class whose value is container . - **Text Content (文本内容)** : 存储在 Text Nodes 当中的纯文字信息, 不含任何 markup language symbols like <> />< etc.. 此外还有 Comment nodes, CDATA section nodes among others but they're less frequently encountered during normal development processes.[^3] #### 3. 访问 DOM 节点的方法 以下是几种常见的获取指定 DOM 元素的技术手段: - 使用 `getElementById()` 方法依据唯一 id 查找单个元素; - 利用 `querySelector()` 函数执行 css selector 查询语句得到首个符合条件的结果 ; - 如果需要检索多个满足条件的目标,则可考虑采用 `getElementsByClassName()`, `getElementsByTagName()`,或者 `querySelectorAll()`等方式批量选取所需项目列表形式返回结果集实例化后的 HTMLCollections/NodeLists 对象供后续进一步迭代处理之需[^3]. --- ```javascript // Example of accessing different types of dom elements using various methods. const singleElement = document.getElementById('uniqueId'); console.log(singleElement); const firstMatchedItem = document.querySelector('.className'); console.log(firstMatchedItem ); const allItemsWithSameClassNames = document.getElementsByClassName('commonClass'); for(let i=0;i<allItemsWithSameClassNames.length;i++) { console.log(allItemsWithSameClassNames[i]); } ``` 以上代码演示了几种不同的查找技术实际应用场景下的简单示范案例说明。 --- ### 总结 总之,掌握了 DOM 的基础知识之后,就可以开始尝试编写更加复杂的交互式网站应用程序了。记住始终要遵循最佳实践原则,合理规划层次分明清晰易懂的代码风格有助于提高维护效率降低错误发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值