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

C语言笔记6:变量生命周期、指针与数组指针全解析

#本篇博客基于C语言学习这两天核心笔记整理,聚焦变量生命周期与存储类型指针基础与用法数组与指针深度结合三大模块,从基础概念到代码实战,帮你彻底吃透C语言核心难点。


一、变量生命周期与存储类型

1. 核心概念

  • 生命周期:变量从内存分配内存释放的整个时间段。
  • 存储区域
    • 静态存储区:全局变量、static变量,程序启动分配、退出释放。
    • 栈区(动态存储):局部变量、函数形参,函数调用时分配、结束释放。
    • 堆区:手动申请/释放内存(malloc/free)。

2. 四大存储类型

  1. auto(自动)
    • 修饰局部变量,默认存储类型(可省略)。
    • 存于栈区,函数/代码块结束立即释放。
  2. static(静态)
    • 修饰局部变量:生命周期延长至程序结束,仅初始化1次,作用域不变。
    • 修饰全局变量/函数:限制作用域为当前文件,实现私有化。
  3. extern(外部)
    • 扩展全局变量/函数作用域,跨文件访问(需多文件联合编译)。
  4. register(寄存器)
    • 修饰局部变量,提示存入CPU寄存器提升速度,不能用&取地址

3. 面试高频:static关键字作用

  1. 局部变量:延长生命周期,作用域不变。
  2. 全局变量:限制作用域为当前文件,生命周期不变。
  3. 函数:变为内部函数,仅当前文件可调用。

二、指针基础核心

1. 指针本质

  • 指针 =内存地址,通过地址间接访问内存空间。
  • 变量指针:变量的基地址(&a),不可修改。
  • 指针变量:存储地址的变量(int *p),可修改指向。

2. 指针关键操作

  • &:取地址符,获取变量基地址。
  • *:解引用符,访问指针指向的内存值。
  • 地址输出格式:%p(十六进制)。

3. 指针尺寸

  • 32位系统:指针占4字节
  • 64位系统:指针占8字节(与类型无关)。

4. 指针两大交换方式

  1. 交换指针指向:不修改原变量值,仅改变指针指向。
  2. 交换指向变量值:修改原变量数据,指针指向不变(函数传参修改实参常用)。

5. 指针做函数参数

  • 传递变量地址,可直接修改实参(输出型参数),解决普通传参无法修改的问题。

三、数组与指针深度结合

1. 数组名本质

  • 数组名等价于首元素地址arr == &arr[0]),是指针常量,不可修改。

2. 指针运算

  • 指针±n:偏移n × 类型大小字节。
  • 指针自增/自减:每次偏移1个类型单位。
  • 指针差值:结果为相差元素个数

3. 数组四种遍历方式

  1. 下标法:arr[i](最直观)。
  2. 数组名+偏移:*(arr+i)
  3. 指针变量自增:int *p=arr; p++; *p
  4. 指针范围判断:p < arr+len

4. 数组指针(指向整个数组的指针)

  • 定义:数据类型 (*p)[数组容量] = &数组名
  • 一维数组指针:int (*p)[3] = &arr(*p)[i]等价arr[i]
  • 二维数组指针:int (*p)[3] = arr,用于遍历二维数组行地址。

5. 指针与数组互转

  • 形参数组int arr[]等价于int *arr,数组退化为指针。
  • 实参可传数组名/指针,形参可写数组/指针,完全兼容。

四、核心实战与面试考点

  1. 指针实现数组逆序:首尾指针相遇交换,禁止下标法。
  2. 指针遍历字符串:以\0为结束标志。
  3. 二维数组指针操作:转置、统计上三角元素、找最大值地址。
  4. 动态内存malloc申请、free释放,结合指针实现数组增删改查。
  5. 声明辨析:指针、数组、指针数组、数组指针、函数指针区分。
http://www.jsqmd.com/news/622960/

相关文章:

  • 联合概率数据关联(JPDA)与卡尔曼滤波:多目标跟踪中的精准状态估计
  • 基于MOPGA-NSGA-II 的电动车多目标路径优化研究(考虑路况天气与充电约束)(Matlab代码实现)
  • FaceFusion使用指南:如何配置局域网访问实现多端协同?
  • 别再死记硬背Hive架构图了!从一次SQL查询失败,带你手把手拆解Driver四大组件的工作流程
  • 从零到精通:GraphvizOnline在线流程图工具完全指南
  • 如何用Mermaid Live Editor快速创建专业图表:免费实时编辑完全指南
  • C++基础语法2-模板
  • 如何快速找回加密压缩包的密码:ArchivePasswordTestTool终极指南
  • FPGA数字前端
  • 学会评估模型的拟合状态和泛化能力
  • 密度峰值聚类(DPC)的5个常见误区及改进方案
  • 深度解析:Legacy-iOS-Kit - 终极iOS设备降级与越狱解决方案
  • 如何用10分钟语音打造专业AI变声器:RVC语音转换终极指南
  • WarcraftHelper终极指南:轻松解决魔兽争霸III现代系统兼容性问题
  • NumPy随机数生成函数的多种实现方法
  • 告别ATE测试瓶颈:手把手教你用Tessent BFD优化SSN内部总线速率与Loop Timing
  • 如何用ViGEmBus在Windows上实现专业级游戏控制:3个简单步骤解锁无限可能
  • 卡证检测矫正模型代码实例:Python调用HTTP API实现批量卡证处理
  • 3步轻松恢复Windows 11任务栏拖放功能:Windows11DragAndDropToTaskbarFix完全指南
  • 3分钟极速上手:网盘下载加速神器全功能使用指南
  • RuoYi系统角色权限划分与控制
  • C#如何用S7.NET快速读写西门子PLC数据?保姆级教程(附代码)
  • CosyVoice-300M效果深度解析:模拟“春晚魔术揭秘”风格的语音讲解
  • 深入解析SGP4算法库:卫星轨道计算的完整实战指南
  • 从手机指南针到导弹制导:惯性导航初始校准的5个关键误区
  • Vision Master 视觉软件应用-字符识别
  • Python 系列教案第 3 课:中高阶难度批量文件重命名
  • 六位数码管静态动态显示
  • 分析灶福星家用猛火灶大火力优势,在广州选购它性价比高吗? - mypinpai
  • Verilog generate for循环 vs 普通for循环:如何选择才不会出错?