你了解C语言中的数组指针和函数指针吗?

如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。
数组指针&&函数指针

数组指针

数组指针,即指向数组的指针,是用来存放数组的地址的。那如何取出数组的地址呢?直接&数组名即可。如:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
&arr; // 取出数组的地址

这里的&arr,就能得到数组的地址。如果我们想把它存起来,就需要一个数组指针变量。写法如下:

int (*p)[10] = &arr;

解释一下。首先,括号是不能省略的。如果写成int *p[10],就是个指针数组了,这个数组可以存放10个整形指针变量。

括号把*和数组指针变量名p括起来,此时p会优先和*结合,就是一个指针。把(*p)去掉,剩下的int [10]就是数组的类型,表示这个数组指针变量指向的数组存储int类型的数据,容量是10。

这个数组指针类型是:把变量名p去掉后的int (*)[10]

数组指针应该如何使用呢?这里举一个二维数组传参的例子。比如,我们有一个三行五列的二维数组,请你写一个函数,使用指针来打印这个数组里的值。

int arr[3][5] = {{1,2,3,4,5}, {11,22,33,44,55}, {111,222,333,444,555}};
Print(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0])/sizeof(arr[0][0]));

函数Print的形参应该如何写呢?如果是用一个二维数组接收,我相信大家应该是会写的,但是如果要用指针来接收呢?这个指针是什么类型的呢?

数组传参,数组名表示首元素的地址,二维数组的首元素就是第一行!也就是说,二维数组arr的数组名表示第一行的地址,而第一行是一个含有5个int的一维数组。再换句话说,arr作为二维数组的数组名,表示的是一个含有5个int的一维数组的地址,所以需要一个数组指针来接收,这个数组指针指向一个含有5个Int的一维数组!

void Print(int (*p)[5], int r, int c)
{}

函数体实现的关键就是,如何使用数组指针p来遍历原来的二维数组arr。其实呀,既然是数组名作为参数传过来,就可以当成正常的数组那样使用,比如p[i][j]其实就表示第i行第j列的元素。在C语言中,a[i]就等价于*(a+i),所以p[i][j]就等价于*(*(p+i)+j),所以一下2种实现是等价的。

void Print(int(*p)[5], int r, int c)
{
	for (int i = 0; i < r; ++i)
	{
		for (int j = 0; j < c; ++j)
		{
			// 写法1
			//printf("%d ", p[i][j]);
			// 写法2
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}

如果用数组指针的角度来理解*(*(p+i)+j),应该怎么想呢?p是数组第一行的地址,p+i就是数组第i行的地址,*(p+i)就拿到了数组的第i行,相当于拿到了数组第i行的数组名,也就是数组第i行第一个元素的地址。那么,*(p+i)+j就是数组第i行第j个元素的地址,*(*(p+i)+j)就是数组第i行第j个元素。

函数指针

函数指针和数组指针非常像。数组指针是指向数组的指针,函数指针则是指向函数的指针。也就是说,函数指针是用来存放函数的地址的。

如何取得函数的地址呢?有2中方法:

  1. 函数名就表示函数的地址。
  2. &函数名也表示函数的地址。

比如:

int Add(int x, int y)
{
	return x + y;
}

对于Add函数,Add&Add都能得到它的地址。那么,存放这个地址的函数指针应该如何写呢?

int (*p1)(int, int) = Add;
int (*p2)(int, int) = &Add;

和数组指针非常类似。用括号把*p括起来,表示p是一个指针,去掉(*p)后得到的int (int, int)就是这个指针指向的函数的类型,即参数是int, int,返回类型是int的函数。

这个函数指针类型名是:把变量名去掉后的int (*)(int, int)

使用函数指针可以调用函数,有2种调用方式:

  1. 不解引用,直接调用:p(3, 5)
  2. 解引用后再调用:(*p)(3, 5)

比如,以上的代码可以这么写:

int (*p)(int, int) = Add;
int ret1 = p(3, 5);
int ret2 = (*p)(3, 5);

其实这个解引用操作没啥用,你哪怕写int ret2 = (***************p)(3, 5);,效果和不加*是一样的。

总结

  1. 数组指针是指向数组的指针,数组指针类型由3部分构成:用括号把变量名和*括起来表示是一个指针,左边写指针指向的数组存储的元素的类型,右边用方括号表示指向的数组的容量。
  2. 函数指针是指向函数的指针,函数指针类型由3部分构成:用括号把变量名和*括起来表示是一个指针,左边写指针指向的函数的返回类型,右边用圆括号表示函数的形参列表。
  3. 这两货确实挺像。

感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/11879.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis Lua沙盒绕过命令执行(CVE-2022-0543)

一、描述 影响范围&#xff1a;Debian系得linux发行版本Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞&#xff0c;形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间&#xff1a;2022.3.8 二、原理 redis在用户连接后可以通过eval命令执行Lua脚本&#x…

Flutter成不了“顶流明星”的7大理由

Flutter是一款由Google推出的跨平台移动应用开发框架&#xff0c;近年来备受关注。尽管Flutter在某些方面表现出色&#xff0c;但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评&#xff0c;称其难以成为移动应用开发的“顶流明星”&…

[Java]面向对象高级篇

文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …

在线文章生成工具-原创文章生成工具

在线文章生成器 在线文章生成器是指一种可以在线使用的自动化创造文章的工具。它可以使用自然语言处理&#xff08;NLP&#xff09;技术和人工智能算法提供需要的信息&#xff0c;基于标题、关键字&#xff0c;句子关联性等元素自动创造文章内容&#xff0c;涵盖各种类型&…

Java中线程的常用操作-后台线程、自定义线程工厂ThreadFactpry、join加入一个线程、线程异常捕获

场景 Java中Thread类的常用API以及使用示例&#xff1a; Java中Thread类的常用API以及使用示例_霸道流氓气质的博客-CSDN博客 上面讲了Thread的常用API&#xff0c;下面记录下线程的一些常用操作。 注&#xff1a; 博客&#xff1a;霸道流氓气质的博客_CSDN博客-C#,架构之…

Win10,详细永久关闭更新方法(附图文)

一、服务设置 1.同时按下键盘 Win R&#xff0c;打开运行对话框&#xff0c;然后输入命令 services.msc &#xff0c;点击下方的“确定”打开服务。 2.找到 Windows Update 这一项&#xff0c;并双击打开。 3.停止该服务&#xff0c;启动类型设置为禁用 4.点击恢复&#…

完整指南:如何安装Man手册

Man手册简介 man手册是Unix和类Unix操作系统中的命令行工具&#xff0c;用于提供关于特定命令、函数和文件的帮助文档。它通常包含命令的语法、选项、参数、示例以及其他相关信息。man手册可以通过在终端输入"man"命令&#xff0c;后跟要查看的命令或函数名称来访问…

惠普Probook455电脑开机突然卡住无法进入桌面

惠普Probook455电脑开机突然卡住无法进入桌面解决方法分享。最近有用户使用的惠普Probook455电脑在开机的时候&#xff0c;电脑一直卡在开机的界面上&#xff0c;无法进入到系统中。无论是重启还是安全模式都无法解决问题。那么遇到这个情况怎么去进行问题的解决&#xff0c;来…

远程组态管理的好处

远程组态管理可以简化管理工作&#xff0c;帮助您节省时间和金钱。远程组态管理可以通过各种应用程序来实现&#xff0c;包括&#xff1a; •监控所有设备的状态&#xff0c;以确保它们正常工作。 •记录现场数据&#xff0c;例如温度&#xff0c;压力或流量。 •快速、轻松地…

CSDN粉丝首破一千关,有你名字

2023-4-11&#xff0c;CSDN粉丝首破一千关。 感谢词版本1,哈哈哈哈哈哈哈哈 在编程世界里&#xff0c;人们可以像创造生命一样创造程序&#xff0c;而我对这种创造和创新的热情&#xff0c;从我的csdn博客社区粉丝首次突破一千人的消息中得到了极大的满足和激励。作为一个Pyth…

全面解析反欺诈(羊毛盾)API,助你识别各类欺诈风险

前言 反欺诈&#xff08;羊毛盾&#xff09;反机器欺诈 API&#xff0c;是一种基于大数据分析和模型产品的技术&#xff0c;通过输入手机号、手机 IP 地址进行检测&#xff0c;帮助客户识别大量存在恶意的账号。 反欺诈&#xff08;羊毛盾&#xff09;API 的作用 反欺诈&…

智慧工厂可视化合集,推动行业数字化转型

图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#xff0c;…

【Camunda】 -- Docker 安裝及使用

【Camunda】 -- Docker 安裝及使用1. Docker install Camunda platform1.1 Web2. Big Data -- Postgres1.1 Big Data -- Postgres3.Awakening1.1 Big Data -- PostgresCamunda platform 是一個任務監控的平台。 Camunda Modeler是建模工具。 1. Docker install Camunda platfor…

SpringSecurity之基础认知

前言 之前一直说开一个SpringSecurity的专栏&#xff0c;今天抽空整理一下&#xff0c;准备开始更新。 也欢迎大家订阅此专栏&#xff01; 什么是SpringSecurity&#xff1f; Spring是非常成功的Java应用框架&#xff0c;目前是非常主流的开发框架。Spring Securtiy正是我们…

基于K-最近邻算法构建红酒分类模型

基于K-最近邻算法构建红酒分类模型 描述 Wine红酒数据集是机器学习中一个经典的分类数据集&#xff0c;它是意大利同一地区种植的葡萄酒化学分析的结果&#xff0c;这些葡萄酒来自三个不同的品种。数据集中含有178个样本&#xff0c;分别属于三个已知品种&#xff0c;每个样本…

移动App测试实战—专项测试

移动App测试实战—专项测试 我们在进行了手工的功能测试之后&#xff0c;也开发了一些自动化测试用例&#xff0c;并且做了性能测试之后&#xff0c;测试工作看似比较完整了。但是当我们的App在大量的用户那里被安装和使用的时候&#xff0c;还是会有很多我们之前没有预料的问题…

微服务+springcloud+springcloud alibaba学习笔记【Hystrix(豪猪哥)的使用】(6/9)

Hystrix&#xff08;豪猪哥&#xff09;的使用 6/91、Hystrix熔断器概述2、HyStrix重要概念3、hystrix案例3.1 新建模块 Cloud-provider-hystrix-payment80013.2 创建带降级的order模块 Cloud-comsumer-feign-hystrix-order803.3 配置服务降级:3.3.1 服务降级 Cloud-provider-h…

3年功能测试无情被裁,3个月学习自动化测试重新开始........

前言 不知不觉在软件测试行业工作了3年之久&#xff0c;虽然说我是主做的功能测试&#xff0c;但是我也一直是兢兢业业的呀&#xff0c;不曾想去年7月份无情被辞的消息让我感到一阵沉重。我曾经一直坚信自己的技能和经验足以支撑我在这个领域的未来&#xff0c;但现实却告诉我&…

日撸 Java 三百行day31

文章目录day31 整数矩阵及其运算面向对象思想java异常处理java中的getter和setter方法代码day31 整数矩阵及其运算 面向对象思想 结合之前day7和day8面向过程开发&#xff0c;只关注了矩阵加法和矩阵乘法的功能。而day31是面向对象开发&#xff0c;一个矩阵类&#xff0c;在这…

傅盛“追风”GPT,猎户星空春天来了?

GPT的横空出世&#xff0c;让冷清已久的商用服务机器人市场&#xff0c;又有了“新故事”。 从技术底层逻辑而言&#xff0c;服务机器人受到这类新技术的影响会更为明显。因为抛开硬件&#xff0c;服务机器人的内核其实就是AI&#xff0c;GPT大模型的出现显然成了现阶段该产业进…