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

【C语言指针进阶】一篇搞懂数组指针与指针数组、二级指针、指针函数与函数指针的区别

一、数组指针

数组指针:本质是指针,指向数组整体的指针。

语法:

int (*变量名)[5]; // 定义了一个指针变量,指针变量自己占 8 字节空间,可以指向一个具有 5 个元素的整型数组。 // 定义了一个指向 5 个整形元素的数组的指针。 a:首元素地址 ---> &a[0] ---> int* &a:数组的指针 ---> int (*)[5]; &a+1:数组指针+1 ---> 代表偏移整个数组(sizeof(a)字节)

注意:

int a[5] = {1,2,3,4,5}; a:首元素地址 ---> int * 除了 2 种场景: 1.sizeof(a/数组名); a 不能当作 int * 类型,当作数组整体,代表整个数组。 2.&a; 数组指针,该指针类型为 int (*)[5]; 指向一个数组整体。

二、指针和二维数组

二维数组的数组名是首元素地址,首元素是一维指针,所以二维数组数组名本质是一维数组指针。

int a[5] = {1,2,3,4,5}; a ---> 首元素地址 ---> &a[0] ---> int * ---> 指针 a[n] ---> *(a+n) int a[2][3] = {1,2,3,4,5,6}; a ---> 首元素地址 ---> &a[0] ---> int (*)[3] ---> 数组指针 a[m][n] ---> *(a[m]+n) ---> ((a+m)+n) ---> *(a+m)[n]

二维数组的数组名作为函数参数传递:

int a[2][3] = {1,2,3,4,5,6}; void print_2D_array(int a[][列数], int row) {} void print_2D_array(int (*pa)[列数], int row); {} print_2D_array(a, 2); char str[2][100] = {"hello world", "how are you"}; void print_str_array(char str[][100], int row) {} void print_str_array(char (*pstr)[100], int row) {} print_str_array(str, 2);

三、指针数组

指针数组:本质是数组,该数组中保存的是指针。

语法:

int a[5]; int *a[5]; // int *:数组中保存的数据类型,该数组中保存的是 int * 指针。 // [5]:该数组中可以保存 5 个指针(int *)。 // 定义了一个可以保存 5 个整形指针的数组,整体占 40 个字节。 char *p[5];

(1)指针数组的定义

指针类型 数组名[元素个数];

(2)指针数组的初始化

char *p = NULL; char *p[5] = {NULL}; // 将 5 个字符型指针初始化成 NULL char *p = "hello"; char *p[5] = {"hello", "world", "how", "are", "you"}; // p[0] ---> char * ---> p[0] 指针保存字符串常量 "hello" 的首地址 // p[1] ---> char * ---> p[1] 指针保存字符串常量 "world" 的首地址 // p[2] ---> char * ---> p[2] 指针保存字符串常量 "how" 的首地址 // p[3] ---> char * ---> p[3] 指针保存字符串常量 "are" 的首地址 // p[4] ---> char * ---> p[4] 指针保存字符串常量 "you" 的首地址 char *p1 = "hello"; char *p2 = "world"; char *p3 = "how"; char *p[3] = {p1, p2, p3};

(3)指针数组和二维字符型数组的区别

char str[3][100] = {"hello", "world", "how"}; sizeof(str) = 300 字节 char *pstr3[3] = {"hello", "world", "how"}; sizeof(pstr) = 24 字节 ---> sizeof(char *) = 8 字节 区别: 二维字符型数组中保存的是多个字符串本身;指针数组中保存的是多个字符串的首地址。 要保存多个字符串用二维字符型数组;要操作多个字符串用指针数组。

四、二级指针

二级指针:本质还是指针,是一个指针变量的地址。

int **指针名称; // 保存整形指针的指针 char **指针名称; // 保存字符型指针的指针

C 语言中主要有两个二级指针的应用场景:

(1)想要在被调函数中修改主调函数中的指针变量,实参需要传递该指针变量的地址;形参用二级指针接收;

(2)指针数组的数组名,是一个二级指针,实参传递指针数组的数组名时,形参用二级指针接收。

char *str[3] = {"hello", "world", "how"}; // str[0] ---> char * ---> 保存了字符串常量 "hello" 的地址 // str ---> &str[0] ---> char ** ---> 二级指针
  • 值传递:无法在被调中修改主调中的变量,只能使用该变量。

  • 指针传参:可以在被调中修改主调中定义的变量,也可以使用该变量。

  • 值传递:恰好传递的值是一个指针变量,无法在被调用修改主调中定义的指针变量,可以使用该指针变量。

  • 指针传参:可以在被调函数中修改主调函数中定义的指针变量,也可以使用该变量。

五、指针函数

指针函数:本质是函数,具有指针类型返回值的函数。

指针函数能返回什么指针?

(1)局部变量的地址不能被返回(变量,数组);

char str[32] = {"hello world"}; char *str = "hello world";

(2)具有静态生命周期的变量的地址可以被返回;

1)static 修饰的静态变量的地址;

2)全局变量的地址。

(3)可以返回字符串常量的地址;

(4)可以返回通过参数传递给该函数的地址;

(5)可以返回堆区申请的且没有被释放的空间地址。

六、函数指针

函数指针:本质是指针,指向函数的指针。

函数:函数的函数名,为函数的入口地址。

(1)定义函数指针

函数声明: int fun(int , int ); int *pfun(int , int ); 函数指针: int (*pfun)(int , int ); // 定义了一个函数指针变量,该指针在内存中占 8 字节, // 该函数指针可以指向一个具有 int 返回值、两个 int 类型参数的函数。 char *(*pfun)(char *); 总结: 返回值类型 (*指针名称)(形参表);

(2)函数指针初始化

int (*pfun)(int, int) = NULL;

(3)函数指针赋值

int add(int num1, int num2) {} int (*pfun)(int, int) = NULL; pfun = add;

(4)函数指针调用函数

函数名(实参表); 函数指针的名称(实参表);

(5)函数指针的应用

  • 回调函数

    <p>将函数作为某个函数的参数传递,传递的函数称为回调函数;</p> <p>主要为了降低代码的耦合度(关联度),减少重复代码。</p> </li>
http://www.jsqmd.com/news/1336113/

相关文章:

  • 穿越机飞行稳定性终极解决方案:Betaflight 2025.12完整指南
  • 2026年减振器支架总成点焊机行业专用焊机厂家选择指南 - 全域品牌推荐
  • 【面向对象】复习日:面向对象基础 + UML + 设计原则(整理对比表 + 板块总结)
  • 如何在linux搭建codex + codex web
  • 深度解析大庆市建设局网站如何助力城市转型与民生服务优化
  • Next.js项目升级TypeScript 7实战:解决baseUrl弃用与路径别名迁移
  • 我用AI博客搭了个后台,运维人的 Dashboard 比公司那套还精致
  • C++获取字符串最后一个单词长度的多种方法
  • ABAP屏幕设计:从SE51布局到流逻辑的完整开发指南
  • 楼盘漫游动画:让客户在5-20分钟里“走进”未来的家
  • 佛山管道疏通公司口碑**:2026年本地正规品牌综合对比与推荐 - 园子一号
  • Unity DOTS ECS架构实战:万鱼同屏性能优化与数据导向设计
  • 2026 上海房产分割律师收费标准,高性价比律师 / 团队怎么选推荐君澜孙青联系电话13681945561 - 孙青律师13681945561
  • 2026深圳家庭搬家全流程**指南:打包分类、楼层吊装、新家还原、预算测算完整手册 - 禧燕搬家
  • 小白程序员必看:收藏这份Data Agent进阶指南,轻松玩转大模型数据分析
  • GetQzonehistory:5分钟快速找回你的QQ空间青春记忆
  • 5个技巧掌握Buzz音频转录工具,工作效率提升300%
  • Windows 10登录失败:从紧急抢救到系统级修复的完整指南
  • 【制造业AI部署黄金72小时】:从PLC数据接入到MOM系统联动,一份经17家工厂验证的标准化实施Checklist
  • 高并发架构、AI硬件配置与智能系统开发实战解析
  • GlobeLand30全球地表覆盖数据:从下载到城市扩张分析的完整指南
  • 2026年近期地下室远红外防潮防霉系统实力企业推荐与选型指南 - 企业深度能力测评
  • AI Agent实战:从Agent Plan到Seedance 2.0的工程化探索
  • 2026 上海房产确权律师收费标准,高性价比律师 / 团队怎么选推荐君澜孙青联系电话13681945561 - 孙青律师13681945561
  • 网站建设确认单到底该怎么签才不吃亏?深度解析网站建设确认单的每一个细节与坑位
  • HC-06蓝牙模块从入门到实战:硬件连接、AT命令配置与Arduino编程全解析
  • 揭秘厦门市建设与管理局网站:查询办事指南与项目审批的全景指南
  • AI微博运营不是替代人,而是淘汰不会用AI的人——2024Q2行业人才能力图谱首发,你卡在第几层?
  • Congruence (Modular Congruence) – Basic Exercises with Answers
  • 夸克网盘自动化助手:智能转存与媒体库管理的终极解决方案