欢迎光临
我们一直在努力

C语言学习Day13:指针进阶核心难点解析

前言

今日聚焦指针进阶核心难点,内容围绕void万能指针、二级指针、指针数组、数组指针、二维数组传参展开,全程侧重理论考点,无多余练习题,整理应试与嵌入式高频知识点。

一、void指针(万能无类型指针)

1. 核心作用

  • 通用存储:仅用来存放任意内存地址,不绑定数据类型
  • 泛型传参:函数传参时,任意类型指针均可转为void*,实现一个函数兼容所有数据类型

2. 基础语法规则

  • char* / int* / double* 可以自动隐式转换为 void*
  • void* 无法直接解引用*p、不能p++/p–偏移,编译器无法确定字节步长
  • 读写、偏移前,必须强制转换为对应具体指针类型

3. 示例

// 给指定内存地址赋值
*((int *)((void *)0x12345678)) = 0x11223344;

二、二级指针

1. 定义

二级指针:存放一级指针变量地址的指针,格式:int **q

2. 核心使用场景

  • 函数内部想要修改外部一级指针本身的指向,必须传入一级指针的地址(二级指针)
  • 字符串数组、指针数组做函数传参,常规需要二级指针搭配长度使用

3. 层级通俗理解

  • a:普通整型变量
  • p=&a:一级指针,存放变量a的地址,*p代表a的值
  • q=&p:二级指针,存放一级指针p的地址,*q代表p,**q代表a的值

三、指针数组 & 数组指针(考试最易混淆区分)

3.1 指针数组

  • 本质:数组,数组内每一个元素都是同类型指针
  • 定义格式:int *a[5];
  • 解析:[]优先级高于*,a先和[5]结合成为数组,元素为int*指针
  • 内存:5个int指针,在32位系统占用20字节
  • 典型用途:存储多组字符串,实现批量字符串管理

3.2 数组指针

  • 本质:指针,专门指向一整个数组
  • 定义格式:int (*p)[5];
  • 解析:括号改变优先级,p先和*结合为指针,指向长度为5的int数组
  • 内存:仅占8字节(64位系统)
  • 典型用途:二维数组传参,专门接收二维数组数组名

3.3 极简区分口诀

  • 不带括号*a[]:指针数组(数组,装一堆指针)
  • 带括号(*a)[]:数组指针(指针,指向一整个数组)

四、一维数组特殊规则

  • 数组名a常规等价于&a[0],是首元素地址
  • 两种例外:
  • sizeof(a):计算整个数组占用总字节
  • &a:取整个数组的首地址,类型为数组指针
  • 数组指针解引用*(&a),类型降级,变回首元素指针int*

五、二维数组与传参

1. 二维数组底层逻辑

int a[2][3] = {1,2,3,4,5,6};

  • a:指向一整行的数组指针
  • a[0]、*a:指向本行第一个元素的一级指针
  • a[m][n]等价写法:*( *(a+m)+n )

2. 二维整型数组传参规范

函数形参必须写明单行元素个数,行数可省略:

int fun(int (*parray)[3], int len);
// 等价写法
int fun(int parray[][3], int len);

3. 元素访问通用写法

a[m][n]
*(a[m]+n)
*(*(a+m)+n)

六、今日知识点总结

  • void指针:万能存地址,读写偏移必须强制类型转换
  • 二级指针:改外部指针用二级指针,普通取值仅需一级指针
  • 括号定本质:(*p)[]数组指针,p[]指针数组
  • 二维数组传参:固定格式必须标注每行长度,数组名是行指针
  • 赞(0)
    未经允许不得转载:171主机测评 » C语言学习Day13:指针进阶核心难点解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址