[C语言]指针详解一、数组指针、二维数组传参、函数指针

一、数组指针

对一个数组,如果我们想要让一个指针指向这个数组,我们应该如何定义呢?我们知道一个数组定义本来就是一个指针,那为何要多定义一个数组指针呢?我们来看看下面这个代码就理解了

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5 };
	int(*parr)[5] = arr;
	printf("%d\n", *(arr + 1));
	printf("%d\n", *(parr + 1));
}

第一个是我们正常定义的数组

int arr[] 

第二个就是我们定义这个数组的指针

要注意与int*parr[5]的区别,我们上面打字的方式代表的是(*parr)指向了一个数组大小为[5]的指针,而int*parr[5]代表了有个parr[5]的数组里面装的都是指向整形的指针

我们来看一下将他们的地址分别加一得到的结果

我们看到第一个输出结果为2,第二个输出结果是一个很大的数字,这是怎么回事呢?

其实正常数组定义出来计算出来的结果+1就是里面的元素地址加对应所占字节大小的长度,所以到了第二个元素的地址

而对于我们定义的数组指针+1是直接越过了整个数组,所以他的地址加了五个元素,我们可以看看数组内地址的分布情况

下面的parr+1打印就让其打印了越界的0x000000C5642FFCCC的值,这就是为什么打印出来的两个数字不同的原因。

二、二维数组传参

二维数组传参的方式有三种,第一种是直接定义一个函数,函数内的类型和数组的大小相定义就好,如 要传递一个整型二维数组,其大小为3行五列,返回值为空,我们只需要输入:

                    void ( int a[3][5] )

 第二种方式就是不输入多少行输入几列就可以了如我们还是传递一个跟上面一样的数组,我们只需要输入

  void ( int a[][5] )

第三种方式就是用我们定义的数组指针的方式,如上述一样的传递参数,我们输入如下:

void(int (*a)[5])

三种方法均可以传递二维数组

注意我们传递过去的参数为二维数组第一行的地址,是第一维数组的地址

三、函数指针

如果我们要将一个函数保存到一个地址内,应该如何表达呢?

下面我们来看一下代码

void(*pfun)()

void*pfun()

这两个表达式哪一个可以存放函数的地址呢?答案是第一个可以存放,第一个*先和pfun结合表示的是一个指针,然后再和()结合表示的是一个函数,最后void表示返回的是空值。

而第二个表达式,代表了pfun这个函数返回了一个空指针类型

两者少一个括号是完全不同的

下面我们来看一下两个有趣的代码来练习一下掌握的情况

    对于代码1,

我们一步步来解读,首先我们看到最前面的*,我们可以断定这个*是对后面括号地址的一个解引用,那后面这段代码是哪个地址呢,我们看括起来的部分这里有一个有意思的地方就是有一个0,那我们想,这里面是不是0这个数字对应的地址呢?对于我们之前学过的一个强制类型转换,我们知道如果对于一个变量,我们可以用(int *)让其来强制转换为指向整型元素的地址,如果我们看这个void(*)()中间加一个随便的变量如p 变成 void (*p)()我们可以发现这是定义了一个函数指针,其实如果这里的p省去后面再加0就代表了把这个0强制转换为函数指针地址,其返回类型为空,如果对其解引用我们就可以看到代码1的样子,最后一个括号为其要输入的参数

  对于代码2

我们看到signal后面有一个括号代表它是一个函数,其中里面的参数第一个为int,第二个是一个函数指针,其中函数指针的输入是int类型返回为void,其次signal返回的类型也是一个函数指针,其中指向类型为int,返回类型为void的函数,其中signal为函数的声明。

对于代码1,有些程序或者编译器允许访问0的地址,但是笔者没有这样的环境就不演示了,对于代码2,我认为看文字理解是有点吃力的,笔者自己看视频也有些难以理解,因为本人能力有限,我把自己所理解的代码2试着自己编写了一个代码验证自己的思想如下:

#include <stdio.h>

void ADD(int b)
{
	b = b + 3;
	printf("%d\n", b);
}

void (*signal(int a, void(*random)(int)))(int)
{

	random(a);
	return random;
}

int main()
{
	int x = 1;
	signal(x, ADD)(4);
}

其中signal函数内部还需要一个返回值为空输入参数为int的函数,我们简单定义一个ADD函数,并且让其输入的参数加三并且打印出来,对于signal函数我们让其调用的时候,对输入的整型变量a调用我们自己定义的函数,也就是ADD函数,然后这个函数要求返回的是一个返回值为空输入变量为int的函数,那很简单,我们让其直接返回random也就是我们自己定义的ADD函数即可

接下来我们在主函数定义一个变量x,让其代入signal(x,ADD)并且后面跟一个4的常量,按理来说应该x先输入进去加3得到4并且打印出来,然后我们返回ADD函数,在进行ADD(4)得到4+3=7再打印出来,我们看看输出结果是不是这样呢?

可以看到本人自定义的函数输出结果确实如此,不知道这样有没有让读者更加理解第二个代码呢?

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

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

相关文章

Docker与containerd:容器技术的双璧

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker幻想曲&#xff1a;从零开始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Docker和containerd的背景…

SpringBoot如何优雅实现远程调用

微服务之间的通信方式 常见的方式有两种&#xff1a; RPC——代表-dubbo HTTP——代表-SpringCloud 在SpringCloud中&#xff0c;默认是使用http来进行微服务的通信&#xff0c;最常用的实现形式有两种&#xff1a; RestTemplate Feign

深度学习_ResNet_5

ResNet学习目标 什么是ResNet为什么要引入ResNet&#xff1f;ResNet网络结构的特点利用ResNet完成图像分类 什么是ResNet&#xff1f; ResNet&#xff08;Residual Network&#xff09;是一种深度残差网络&#xff0c;由何凯明等人在2015年提出&#xff0c;是深度学习领域中一…

Gartner发布安全运营指南:迈向卓越安全运营的 5 项举措

顶级组织通常会实施一套通用的安全运营活动&#xff0c;以实现成熟&#xff0c;但是&#xff0c;他们在应对快速发展的威胁方面仍然面临挑战。安全和风险管理领导者可以利用这五项举措来加强他们的网络防御工作&#xff0c;同时促进安全投资的更大回报。 主要发现 旨在提升威胁…

【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类

目录 1、JUC&#xff08;java.util.concurrent&#xff09; 1.1、Callable 接口 1.2、ReentrantLock 可重入锁 1.3、Semaphore 信号量 1.4、CountDownLatch 1、JUC&#xff08;java.util.concurrent&#xff09; 这是java中的一个包&#xff0c;存放着多线程编程中常见的…

电机学(笔记一)

磁极对数p&#xff1a; 直流电机的磁极对数是指电机定子的磁极对数&#xff0c;也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说&#xff0c;极对数越多&#xff0c;电机转速越低&#xff0c;扭矩越大&#xff0c;适用于低速、高扭矩的场合&#xff1b;相反&…

MATLAB的使用(一)

一&#xff0c;MATLAB的编程特点 a,语法高度简化&#xff1b; b,脚本式解释型语言&#xff1b; c,针对矩阵的高性能运算&#xff1b; d,丰富的函数工具箱支持&#xff1b; e,通过matlab本体构建跨平台&#xff1b; 二&#xff0c;MATLAB的界面 工具栏:提供快捷操作编辑器…

HCIP的学习(2)

TCP----传输控制协议 是一种面向连接的可靠传输协议。 注&#xff1a;与我之前博客HCIA的学习&#xff08;2&#xff09;结合一起看 面向连接&#xff1a;数据传输前收发双方建立一条逻辑通路 特点&#xff1a; TCP是一种面向连接的传输协议每一条TCP连接有且只能存在两个端…

kafka2.x版本配置SSL进行加密和身份验证

背景&#xff1a;找了一圈资料&#xff0c;都是东讲讲西讲讲&#xff0c;最后我还没搞好&#xff0c;最终决定参考官网说明。 官网指导手册地址&#xff1a;Apache Kafka 先只看SSL安全机制方式。 Apache Kafka 允许客户端通过 SSL 进行连接。默认情况下&#xff0c;SSL 处于…

婴儿专用洗衣机哪个牌子比较好?热诚安利五大出类拔萃婴儿洗衣机

婴儿洗衣机可以用于单独清洗宝宝的衣物&#xff0c;可以有效避免了与大人衣物一起混洗带来的细菌交叉感染。毕竟&#xff0c;在婴儿吃奶或者接触其他材料时&#xff0c;其抵抗力是比较弱的&#xff0c;再加上普通洗衣机无法对婴儿的衣物进行有效的消毒处理&#xff0c;轻则会对…

SpringCache和redis区别?什么是SpringCache?

目录 一、Redis介绍1.1 Redis缓存1.2 redis缓存使用前提1.3 redis使用缓存的时机 二、实际操作案例2.1 常规准备工作2.2 引入配置redis2.2.1 引入redis的启动依赖2.2.2 在application.yml里面配置redis的地址信息等2.2.3 创建redisTemplate的配置类&#xff0c;指定键值序列化方…

探索区块链世界:从加密货币到去中心化应用

相信提到区块链&#xff0c;很多人会想到比特币这样的加密货币&#xff0c;但实际上&#xff0c;区块链技术远不止于此&#xff0c;它正在深刻地改变我们的生活和商业。 首先&#xff0c;让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术&#xff0c;它通过将…

Linux docker1--环境及docker安装

一、基础环境要求 Docker分为ce版本&#xff08;免费&#xff0c;试用7个月&#xff09;和ee版本&#xff08;收费&#xff09;。 最低配置要求&#xff1a;64位操作系统&#xff0c;centOS 7及以上&#xff0c;内核版本不低于3.10 二、部署docker 1、查看服务的基础环境是否满…

MVC接收请求教程

mvc接收各种请求 1-环境搭建 1.1-准备apifox发送请求 1.2-项目搭建 ①创建Web骨架的Maven项目 ​ --打开2023-IDEA &#xff0c;选择New Project ​ --选择Maven Archetype ​ --注意点&#xff1a;Catalog默认就行了 ​ --Archetype选择webapp ​ --JDK跟着黑马敲最好…

情感书单图片怎么制作?书单制作教程分享

情感书单图片怎么制作&#xff1f;情感书单图片制作是一项富有创意和挑战性的任务&#xff0c;它要求我们不仅要有对书籍的热爱&#xff0c;还要有一定的审美和设计能力。幸运的是&#xff0c;现在市面上有许多专业的软件可以帮助我们实现这一目标&#xff0c;让情感书单图片的…

好书推荐 《ARM汇编与逆向工程 蓝狐卷 基础知识》

《ARM 汇编与逆向工程 蓝狐卷 基础知识》 与传统的 CISC&#xff08;Complex Instruction Set Computer&#xff0c;复杂指令集计算机&#xff09;架构相比&#xff0c;Arm 架构的指令集更加简洁明了&#xff0c;指令执行效率更高&#xff0c;能够在更低的功耗下完成同样的计…

并发编程Semaphore(信号量)浅析

目录 一、简介二、API三、使用3.1 demo13.1 demo2 四、适用场景 一、简介 Semaphore&#xff08;信号量&#xff09;是 Java 中用于控制同时访问特定资源的线程数量的工具类。Semaphore 维护了一组许可证&#xff0c;线程在访问资源之前必须先获取许可证&#xff0c;访问完毕后…

【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序

简介 特性 输出频率范围&#xff1a;35 MHz至4,400 MHz 小数N分频频率合成器和整数N分频频率合成器 具有低相位噪声的VCO 可编程的1/2/4/8/16/32/64分频输出 典型抖动&#xff1a;0.3 ps rms EVM(典型值&#xff0c;2.1 GHz)&#xff1a; 0.4% 电源&#xff1a;3.0 V至3.6 V …

Acwing.2060 奶牛选美(DFS)

题目 听说最近两斑点的奶牛最受欢迎&#xff0c;约翰立即购进了一批两斑点牛。 不幸的是&#xff0c;时尚潮流往往变化很快&#xff0c;当前最受欢迎的牛变成了一斑点牛。 约翰希望通过给每头奶牛涂色&#xff0c;使得它们身上的两个斑点能够合为一个斑点&#xff0c;让它们…

构建卓越数据应用体系,释放企业数据资产的最大价值

随着数字化浪潮的汹涌而至&#xff0c;数据已经成为驱动社会发展的重要资源。在这个信息爆炸的时代&#xff0c;如何有效地收集、管理、分析和应用数据&#xff0c;成为摆在我们面前的一大挑战。数据应用体系的建设&#xff0c;不仅关乎企业竞争力的提升&#xff0c;更是推动整…
最新文章