当前位置: 首页 > news >正文

Linux驱动开发理解指针与结构体

第一部分:指针到底是什么?

指针 = 一张“地址小纸条”

  • 普通变量:家里放了一把钥匙(值)。
  • 指针变量:手里拿着一张写着“钥匙放在哪”的纸条(地址)。

看下面这张图(最经典的指针解释):

图里关键点

  • var变量放在地址0x7ffa0757dd4,里面存着10
  • ptr是指针,它自己存的不是10,而是var的地址0x7ffa0757dd4
  • *ptr(解引用) = 顺着纸条找到钥匙,拿到10

一句话总结
指针变量里存的是别人的内存地址,用*才能拿到真正的值。

第二部分:结构体是什么?

结构体 = 一个“文件袋”,里面可以放不同类型的东西。

看下面这张图(结构体在内存里的真实样子):

图里说明

  • struct example里有char aint bchar c
  • 因为CPU喜欢“对齐”(一次读4字节),编译器会自动在中间加padding(填充)
  • 所以整个结构体占12字节,而不是6字节(这在内核驱动里非常重要!)

第三部分:指针 + 结构体 = Linux驱动里的“王炸”

最常用的是指向结构体的指针

看这张超级清晰的图:

图里解释

  • ptr存的是整个结构体的起始地址(1080)
  • 通过ptr->nameptr->roll就能直接访问里面的字段
  • 这就是驱动里struct my_device *dev = ...的真实样子!

再看一张更直观的(指针指向结构体):

驱动里的实际例子

structmy_device{intid;// 设备编号charname[32];// 设备名字};structmy_devicedev;// 普通结构体变量structmy_device*p=&dev;// 指针指向它(驱动里99%都用这种)p->id=1;// 等价于 (*p).id = 1

实例练习

Ubuntu 新建understand_lab.c,复制下面代码运行:

#include<stdio.h>structstudent{intid;charname[20];};intmain(){structstudents={.id=100,.name="Tesha"};structstudent*p=&s;// 指针指向结构体printf("直接访问:id=%d, name=%s\n",s.id,s.name);printf("通过指针访问:id=%d, name=%s\n",p->id,p->name);printf("结构体地址:%p\n",(void*)&s);printf("指针存的地址:%p\n",(void*)p);return0;}

编译运行:

gcc-Wall-gunderstand_lab.c-ounderstand_lab ./understand_lab

输出如下:

第四部分:C语言指针与结构体核心符号对比表(驱动开发专用版)

概念/符号含义(白话解释)适用对象示例代码内存本质(地址视角)驱动开发注意点(避免Panic)等价写法 / 口诀
普通变量直接存放“值”(钥匙)变量本体int a = 42;地址里存的是值本身几乎不用(驱动里全是指针)-
指针变量存放“地址纸条”(指向别人的地址)任何类型int *p = &a;地址里存的是另一个变量的地址必须先判断if (!p),否则空指针Panic“纸条”
&(取地址)“给我这个变量的地址”变量本体p = &a;struct student *sp = &s;返回变量的起始地址只用于赋值给指针变量“拿纸条”
*** ** (星号)①声明指针 ②解引用(打开纸条看内容)①声明时 ②使用时int *p;
*p = 100;
①声明类型
②顺着地址取值/改值
忘记解引用或多解引用会导致野指针“*声明=指针,*使用=打开看”
.(点)访问结构体本体的成员结构体变量(非指针)struct student s; s.id = 100;结构体起始地址 + 成员偏移驱动里几乎不用(指针太多)“本体用点”
->(箭头)访问指向结构体的指针的成员结构体指针struct student *p; p->id = 100;先解引用指针得到结构体地址,再加偏移驱动里90%用这个(filp->private_data 等)“指针用箭头”
结构体把多个不同类型数据打包成一个“文件袋”自定义类型struct my_dev { int id; char name[32]; };连续内存块(可能有padding对齐)必须用container_of从成员反推整个结构体“文件袋”
container_of从成员指针反推出整个结构体指针内核链表/嵌入式结构体dev = container_of(pos, struct my_dev, list);ptr - offsetof(结构体, 成员)驱动灵魂!不掌握这个写不了任何现代驱动“从零件找到整车”
http://www.jsqmd.com/news/493554/

相关文章:

  • 记录一下uniapp项目中自己封装的组件开发环境特别卡的问题
  • Dify私有化上线倒计时72小时——这份由3家金融级客户联合验证的《灰度发布核验清单》正在紧急回收中(含自动巡检脚本)
  • 基于Halcon的距离变换与分水岭算法在骰子点数识别中的应用
  • LoRA训练助手效果对比:传统正则匹配vs Qwen3-32B语义理解tag生成
  • 8大网盘直链下载神器:LinkSwift完全使用指南
  • 微电网保护的关键技术在城市商业园区场景中的应用案例分享
  • 终极无线VR串流指南:如何用ALVR彻底摆脱线缆束缚
  • Z-Image-Turbo_UI界面功能体验:文生图、图生图、图片放大修复全都有
  • RPFM:5大核心功能重塑全面战争MOD开发体验
  • SRS天线轮发提升信道估计精度
  • 曜华激光IV测试仪如何平衡实验室级精度与产线级效率?
  • 深入解析C++开发中‘excpt.h‘缺失问题的根源与修复策略
  • Visualized-BGE批量推理实战:如何用Python代码将图片编码速度提升3倍
  • wan2.1-vae高效工作流:Gradio界面定制+本地化提示词模板库+一键导出PNG/JPG
  • OFA图像描述镜像场景应用:英语学习者用AI对照提升英文描述能力
  • 信创云桌面私有化部署,已纳入国家信创产品目录?
  • Redis系列一:了解Nosql与关系型数据库
  • Halcon图像处理避坑指南:轮廓转区域时Mode参数的正确选择与常见错误
  • 5分钟搞定:用vLLM在消费级显卡上跑Phi-4多模态模型(附实测配置)
  • CGAL/eigenlib/vcglib/boost_1_87_0 CMAKE 配置
  • Qwen2-VL-2B-Instruct与YOLOv8协同实战:智能视频分析系统
  • java毕业设计基于springboot+Java Web的租房管理系统22787207
  • 【收藏级干货】CTF:网络安全大学生的“硬通货“,大厂敲门砖+高薪+保研的捷径
  • 2026全链路CRM业务管理平台横评:五大核心环节能力对决
  • 互联网大厂Java面试故事:严肃面试官与搞笑谢飞机的技术历险
  • Conformer语音识别模型:从原理到工程实践的关键技术解析
  • Vulnhub DC-3 --手搓sql
  • leetcode 274 H指数
  • 6 个让我作为软件工程师生活更轻松的工具
  • 图片旋转判断生产环境应用:高并发图片流中实时角度识别方案