尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C语言深度解析:void指针、二级指针、指针数组与数组指针全梳理

C语言深度解析:void指针、二级指针、指针数组与数组指针全梳理
📅 发布时间:2026/8/4 4:31:08

一、void * 万能空类型指针

1. 核心概念

普通指针(int*/char*/float*)都绑定了固定数据类型,编译器会根据类型确定指针±1时偏移的字节数;而void指针是无类型万能指针,不绑定任何数据类型,仅单纯存储内存地址,不自带解析内存长度的规则。

void*p;// 合法定义,可存放任意类型变量的地址inta=10;charch='A';doubled=3.14;p=&a;// int* 自动隐式转为 void*p=&ch;// char* 自动隐式转为 void*p=&d;// double* 自动隐式转为 void*

2. void指针的限制与强制转换规则

void指针不能直接解引用(*p)、不能直接做自增自减运算,编译器无法知道要读取几个字节的数据,必须强制转换成对应类型指针后才能操作内存:

void*addr=(void*)0x12345678;// 将0x12345678地址强制转为int*,修改4字节内存值*((int*)addr)=0x11223344;

转换逻辑:

  1. 任意类型指针赋值给void*:隐式自动转换,无需强转;
  2. void*赋值给具体类型指针:必须显式强制类型转换,否则编译报错。

3. void指针典型应用场景

  1. 通用函数参数:实现接收任意类型数据的通用接口,标准库memcpy/memset底层全用void*;
    voidcopy_data(void*dest,void*src,intlen);
  2. 泛型容器:模拟C++泛型,一个指针数组存储不同类型数据地址;
  3. 底层内存操作:直接操作物理/虚拟内存地址,驱动、内核开发高频使用。

二、二级指针(**):指针的指针

1. 基础原理

普通指针int *p存放普通变量地址;二级指针int **q存放一级指针变量的地址,相当于指针变量的容器。

内存层级关系:普通变量a←一级指针p=&a←二级指针q=&p

inta=100;int*p=&a;// p存a的地址int**q=&p;// q存一级指针p的地址// 取值分层解析printf("a的值:%d\n",a);printf("一级指针p指向的值:%d\n",*p);printf("二级指针q解一层:p的地址 %p\n",*q);printf("二级指针q解两层:a的值 %d\n",**q);

2. 二级指针核心作用

  1. 函数内修改外部一级指针的指向:值传递仅拷贝数值,无法修改外部实参;若函数需要修改外部指针变量本身,必须传入该指针的地址(二级指针)。
  2. 存储字符串数组(指针数组传参):存储多个字符串的char *str_arr[]本质是一级指针数组,数组名作为函数参数会退化为二级指针char **。

三、指针数组 vs 数组指针(极易混淆核心考点)

3.1 指针数组:数组,元素全是指针

语法:数据类型 *数组名[长度],[]优先级高于*,先结合数组,再修饰指针。

int*a[5];

含义:定义数组a,共5个元素,每个元素类型是int *(int型一级指针);64位系统下每个指针占8字节,整个数组总大小5*8=40字节。

典型使用场景:存储字符串数组

C语言批量存储多段字符串优先使用字符指针数组,比二维字符数组更省内存:

// 每个字符串单独存常量区,数组仅存字符串首地址char*month[]={"Jan","Feb","Mar","Apr","May"};printf("%s",month[0]);// 打印Jan

3.2 数组指针:指针,专门指向一整个数组

语法:数据类型 (*指针名)[长度],括号强制*先结合变量,本质是指针,指向固定列长的完整数组。

intarr[2][3]={1,2,3,4,5,6};int(*p)[3];// 数组指针,指向“包含3个int元素的一维数组”p=arr;// 二维数组名arr本身就是数组指针

特性:

  1. 所有指针变量统一占8字节(64位),和指向数组大小无关;
  2. p++偏移一整行数组字节(本例3*4=12字节),直接跳到下一行首地址;
  3. 二维数组传参标准写法:int fun(int (*parr)[3], int row)。

3.3 快速区分口诀

  1. int *a[5]→ 先看[]→指针数组(数组);
  2. int (*a)[5]→ 先看*→数组指针(指针)。

3.4 二维数组与数组指针的映射关系

inta[2][3]={{1,2,3},{4,5,6}};int(*q)[3]=a;// 多种等价访问元素方式a[0][1];*(a[0]+1);*(*(a+0)+1);q[0][1];*(*(q+0)+1);

层级拆解:

  • a/q:指向整行的数组指针;
  • a[m]/*(a+m):等价行首一维指针,指向当前行第一个元素;
  • a[m][n]:先取第m行首地址,偏移n个int字节,读取对应数值。

四、const修饰指针的4种组合(只读权限细分)

const代表只读,修饰位置不同,限制对象完全不同,分四类场景:

1.const int *p/int const *p:指向内容只读,指针可改

const修饰*p,不能通过指针修改内存值,但指针p可以更换指向:

intx=1,y=2;constint*p=&x;// *p = 10; 编译报错,禁止修改指向内容p=&y;// 合法,指针指向可以切换

2.int *const p:指针本身只读,内容可改

const修饰指针变量p,定义时必须初始化,指针指向永久固定,但能修改内存数据:

intx=1;int*constp=&x;*p=100;// 合法,修改内容// p = &y; 编译报错,不能修改指针指向

3.const int *const p/int const *const p:双向只读

指针不可更换指向,同时不能修改指向内存的值,完全只读。

五、指针函数 vs 函数指针(概念完全割裂)

5.1 指针函数:是函数,返回值为指针

语法:数据类型 *函数名(形参列表),核心是函数,执行结束返回一个内存地址(指针)。

// 返回char*字符串地址char*get_msg(void);

⚠️ 致命禁忌:绝对不能返回局部变量的地址,局部变量存储在栈区,函数执行结束栈内存自动回收,返回野指针导致程序崩溃;仅能返回全局变量、静态局部变量、堆内存地址。

5.2 函数指针:是指针,指向一段函数代码

语法:返回值类型 (*指针名)(形参类型),存储函数在文本区的代码首地址,可间接调用函数、用于回调函数。

intadd(inta,intb){returna+b;}int(*func_p)(int,int)=add;// 两种等价调用方式intres=func_p(1,2);intres=(*func_p)(1,2);

六、补充:野指针与空指针(指针安全基础)

  1. 空指针 NULL
    宏定义#define NULL ((void *)0),指向地址0,该内存为操作系统保护只读区域,禁止解引用*NULL,否则程序段错误;用于指针初始化,标记指针无有效指向。
int*p=NULL;// 规范初始化,避免野指针
  1. 野指针
    两类来源:① 未初始化的局部指针;② 指向已释放/回收的内存。野指针指向随机非法地址,解引用会随机崩溃,开发规范:所有指针定义时初始化为NULL。

七、指针体系总结

  1. void* 万能指针:无类型,必须强转才能解引用,是通用内存操作的基础;
  2. 二级指针**:用于修改外部一级指针、接收指针数组;
  3. 指针数组=存指针的数组,数组指针=指向完整数组的指针,二维数组传参依赖数组指针;
  4. const分四类修饰规则,区分限制「指针本身」还是「指向内容」;
  5. 指针函数返回地址,函数指针存储函数入口,二者不要混淆;
  6. 所有指针操作优先初始化NULL,杜绝野指针保证程序稳定性。

相关新闻

  • 通过HTTP协议调用Kettle资源库中的ETL任务
  • ArkTS 函数进阶:箭头函数、回调、闭包与重载全解析
  • 2026汉中政企宣传片制作公司排行榜TOP5 | 党建宣传片 | 政府汇报片 | 会议拍摄 | 视频直播 | 招商宣传片服务商评测对比 - 政企影像扫地僧

最新新闻

  • 2026 年现阶段揭阳可靠的数控四轴卷圆机制造商推荐,别再用老设备卷圆了,这玩意儿能帮你省一半工时还不偏心?-伟达机械 - 行业鉴选官
  • Log4j 1.x与2.x配置实战:从核心原理到高并发调优
  • DOTS与GPU烘焙:次世代骨骼动画优化方案解析
  • 2026 年 7 月新发布:南芬比较好的海狮出租平台怎么联系,花10万办年会,租这玩意儿比找马戏团靠谱十倍?-宏达海洋动物表演 - 行业推荐官【认证】
  • AWD Watchbird:轻量级PHP Web文件监控与防护工具实战指南
  • 2026 年现阶段,天祝藏族自治口碑好的储水池防渗复合土工膜厂家哪家靠谱,你花大价钱做的储水池,竟因没选对这玩意儿白扔了好几万 - 行业鉴选官

日新闻

  • 5分钟快速搭建智能数字人:Live2D虚拟形象终极部署指南
  • 告别繁简字幕转换烦恼:这款开源工具让你一键搞定影视字幕处理 [特殊字符]
  • GPT-5.4传闻背后:大模型永久记忆与极限推理的技术演进与挑战

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号