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

C语言指针深度剖析:从内存地址到传址调用

C语言指针深度剖析从内存地址到传址调用指针是C语言的精髓也是许多初学者觉得难以掌握的部分。本文将系统讲解内存与地址的关系、指针变量的定义与使用、指针类型的意义、const修饰指针、指针运算、野指针的成因与规避、assert断言的使用最后通过模拟strlen和交换函数深刻理解传值调用与传址调用的区别。目录一、内存和地址二、指针变量和地址三、指针变量类型的意义四、const修饰指针五、指针运算六、野指针七、assert断言八、指针的使用和传址调用一、内存和地址计算机中的内存被划分为一个个内存单元每个单元大小为1字节。每个内存单元都有一个唯一的编号这个编号就是地址在C语言中也称为指针。32位机器有32根地址总线可产生2 32 2^{32}232种地址每个地址占4字节。64位机器有64根地址总线每个地址占8字节。内存单元的编号 地址 指针二、指针变量和地址2.1 取地址操作符创建变量时系统为其分配内存空间。使用可以获取变量的起始地址。inta10;printf(%p\n,a);// 打印a的地址第一个字节地址2.2 指针变量和解引用操作符*指针变量是专门用来存放地址的变量。inta10;int*paa;// pa是指针变量类型为int*解引用操作符*通过地址访问其指向的对象*pa20;// 等价于 a 202.3 指针变量的大小32位平台指针变量占4字节64位平台指针变量占8字节指针变量的大小与类型无关char*、int*等大小相同。三、指针变量类型的意义指针类型决定了解引用操作的权限一次能访问几个字节指针±整数的步长3.1 解引用权限intn0x11223344;int*pin;*pi0;// 将n的4个字节全部改为0char*pc(char*)n;*pc0;// 只将n的第一个字节改为03.2 指针±整数的步长int*pin;char*pc(char*)n;printf(%p\n,pi);// 假设 0x1000printf(%p\n,pi1);// 0x1004跳4字节printf(%p\n,pc1);// 0x1001跳1字节3.3void*类型void*是泛型指针可以接收任意类型地址但不能直接进行解引用和指针运算常用于函数参数实现泛型编程。四、const修饰指针4.1 const修饰变量const修饰的变量在语法上不能被直接修改constintn0;n20;// 编译错误4.2 const修饰指针变量写法含义const int *pconst在*左边指针指向的内容不能通过p修改但p本身可以指向其他变量。int *const pconst在*右边p本身的值不能修改不能指向别处但可以通过p修改指向的内容。const int *const p指针本身和指向的内容都不能修改。五、指针运算5.1 指针 ± 整数利用数组连续存储的特性通过指针遍历数组intarr[10]{0};int*parr[0];for(inti0;i10;i){*(pi)i;// pi 跳过i个元素}5.2 指针 - 指针两个指针相减得到它们之间元素的个数前提指向同一数组。intmy_strlen(char*s){char*ps;while(*p!\0)p;returnp-s;// 指针之差 字符个数}5.3 指针的关系运算可以比较指向同一数组的两个指针的大小地址高低。while(parrsz){...}六、野指针野指针指向不可知的地址使用它会引发不可预料的错误。6.1 野指针的成因指针未初始化局部指针变量默认随机值。指针越界访问超出数组范围。指针指向的空间被释放如返回局部变量的地址。6.2 如何规避野指针初始化指针明确指向时赋值地址否则置为NULL。小心指针越界。不再使用时及时置为NULL使用前检查有效性。不要返回局部变量的地址。int*pNULL;// 安全初始化// ...if(p!NULL){// 使用p}七、assert断言assert是定义在assert.h中的宏用于在运行时检查条件是否满足。assert(p!NULL);如果条件为假程序终止并输出错误信息文件名、行号。可以在#include assert.h之前定义#define NDEBUG来禁用所有断言通常用于Release版本。断言帮助程序员快速定位逻辑错误是调试的有力工具。八、指针的使用和传址调用8.1 模拟实现strlenintmy_strlen(constchar*str){intcount0;assert(str!NULL);while(*str){count;str;}returncount;}8.2 传值调用 vs 传址调用经典问题交换两个整数的值。传值调用将变量本身传给函数形参是实参的临时拷贝函数内修改形参不影响实参。voidSwap1(intx,inty){inttmpx;xy;ytmp;// 只交换了形参}// 调用Swap1(a, b) 无法交换a和b传址调用将变量的地址传给函数通过指针间接操作实参。voidSwap2(int*px,int*py){inttmp*px;*px*py;*pytmp;}// 调用Swap2(a, b) 成功交换a和b结论若函数只需要使用实参的值采用传值调用。若函数需要修改实参必须采用传址调用。总结指针是C语言访问内存的直接途径。理解内存与地址、掌握指针变量的定义与运算、区分指针类型意义、正确使用const和assert、避免野指针并能够根据需求选择传值或传址调用是学好C语言的关键。后续深入指针(2)(3)(4)将探讨更高级的指针用法如二级指针、函数指针、指针数组等。
http://www.zskr.cn/news/1343617.html

相关文章:

  • 阿盖洛印相×真实银盐底片对比实测:27组DxO基准图像分析证明——MJ v6.2已逼近1930年代Kodak Azo纸动态范围(附测试集下载)
  • 今日实测有效的淘宝闪购外卖/京东外卖/美团外卖红包天天领取口令怎么领今天可用的外卖红包神券?
  • 2026最新诚信优选 安庆市迎江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 随钻连斜传感器操作手册:定向探管安装调试、故障排查与保养要点
  • 如何让Mac永不休眠:自动鼠标移动器的终极指南
  • 油雾净化设备哪家技术更专业
  • 今天实测有效!2026淘宝京东天猫618红包领取口令最新推荐怎么天天领618淘宝京东天猫红包?
  • 《从 0 实现 SGLang》第 1 篇 · LLM 推理引擎到底在做什么
  • 2026年必看:六款热门AI编程工具横评,Trae与Cursor怎么选
  • 如何用3D打印打造1000美元内的开源六轴机械臂:完整DIY指南
  • 终极Sollumz完整指南:从零开始掌握GTA V模型编辑
  • 轻量化无广告!开箱即用 M3U8 在线播放器,调试预览一步到位
  • 终极视频修复指南:使用UNTRUNC拯救你的损坏视频文件
  • # 如何从控制台获取
  • 深圳GEO服务商能不能保证关键词上AI推荐首页?
  • 初次体验 Taotoken 从注册到完成第一个 Python API 调用的全过程
  • MatMul 算子在昇腾 NPU 上的优化实践:从原理到实战
  • windows VS2026 编译32位 onnxRuntime
  • MySql存储引擎与索引
  • 从低空协议劫持实战看 MAVLink 二进制审计在飞控发布环节的必要性
  • HYPE分布式水文模型建模方法与案例分析实践技术应用:精准完成子流域划分;系统解锁土地利用、土壤数据提取技巧
  • Light: Science Applications | 从平坦能带到量子行走:非阿贝尔Thouless泵浦的新篇章
  • 2026最新诚信优选 重庆市万州区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 【JUC】线程池
  • 2026年信创考勤系统推荐与选型对比:政策要求及5款主流产品全解析
  • 深圳电商财税公司推荐top8,商家选型参考!
  • BeeWorks 的 “链端管“ 安全体系到底有多强?
  • 2026最新诚信优选 重庆市綦江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 吕梁市离石区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 《数据挖掘(主编:吕欣 王梦宁)》读书笔记:异常检测方法梳理与实践理解