C语言学习过程总结(18)——指针(6)

一、数组指针变量

在上一节中我们提到了,指针数组的存放指针的数组,那数组指针变量是什么呢?

显而易见,数组指针变量是指针

同样类比整型指针变量字符指针变量里面分别存放的是整型变量地址和字符变量地址,我们可以知道,数组指针变量存放的是数组的地址,是可以指向数组的指针变量

int *p1[10];
int (*p2)[10];

对比上面的p1和p2,谁是数组指针变量?

 int (*p2)[10];

这里需要知道:[ ] 的优先级高于 *  

要想是指针变量,就需要* 和 p 先结合,所以需要括号改变运算顺序。

 那 int *p1[10]; 是什么呢?

这就是我们上一节讲的指针数组。

1、数组指针变量如何初始化

数组指针变量是用来存放数组的地址的,那数组的地址是如何获得的呢?  &arr就可以了。

如果需要存放一个数组的地址,就需要存放在数组指针变量中

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

需要注意!

1、

int *p[10] = &arr;

p++ == arr + 1;

2、

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

p + 1 != arr + 1

第二种的p+1是跳过整个数组

 2、二维数组传参的本质

先观察下面的test1 和 test2

void test1(int arr[3][5],int r,int c) {

	for (int i = 0; i < r; i++) {

		for (int j = 0; j < c; j++) {

			printf("%d ", arr[i][j]);
		}

		printf("\n");

	}

}


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

	for (int i = 0; i < r; i++) {

		for (int j = 0; j < c; j++) {

			printf("%d ", *(*(p + i) + j));
		}

		printf("\n");

	}

}
int main() {
	int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	test1(arr, 3, 5);
	printf("\n");
	test2(arr, 3, 5);
	return 0;
}

两者的输出结果一样

根据数组名就是数组首元素地址这个信息,我们可以推论出,二维数组的数组名就是第一行的地址,也就是第一行数组的地址。

意味着:二维数组的传参本身是传地址,传递的是第一行的一维数组的地址

三、函数指针变量

创建函数指针变量

通过前面多次的类比学习,我们可以和轻易的得到,函数指针变量就是存放函数地址的指针,通过指针去指向函数的地址来调用函数。


	printf("test  = %p\n", test1);
	printf("&test = %p\n", &test1);

我们在刚刚的main函数中加入这两句代码,来帮助我们了解函数是否存在地址

 

可以得出:函数是有地址的,而且因为两者的地址相同,所以函数名就是函数的地址、

拿到了函数的地址,我们就只需要将其存放起来,就可以创建函数指针了

观察下面的代码:

void test() {

	printf("haha\n");
}

int  Add(int x,int y) {

	return x + y;
}

int main() {
	
	void (*pf1)() = test;
	void (*pf2)() = &test;

	int (*pf3)(int x,int y) = Add;
	int (*pf4)(int ,int ) = &Add;

	(*pf1)();
	(*pf2)();


	printf("%d\n", (*pf3)(3,4));
	printf("%d\n", pf4(4,5));

	return 0;
}

对于test和add函数的调用这次没有使用函数名,而是使用函数指针调用。

同时我们还可以通过运行结果看出,使用函数指针去调用函数的时候,是不用解引用指针名的

如: pf4(4,5)  依然得到了正确结果9。

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

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

相关文章

每周AI新闻(2024年第11周)Meta公布Llama 3集群细节 | Sora将于年内推出 | 全球首个AI软件工程师发布

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 每周日解读每周AI大事件。 欢迎关注同名公众号【陌北有棵树】&#xff0c;关注AI最新技术…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装&#xff1a; 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图&#xff1a; 2.热力图&#xff1a; 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

【ollama】linux、window系统更改模型存放位置,全网首发2024!

首先是window系统 so easy 直接进入系统环境变量添加就行 其次是linux系统 全靠自己试出来的,去Ollama官网找半天文档不知道在哪,而且linux也没有说:【 https://github.com/ollama/ollama/blob/main/docs/README.md https://github.com/ollama/ollama/blob/main/docs/li…

Ubuntu 如何安装 Beyond Compare?

Ubuntu20.04安装Beyond Compare 4.3.7 一、官网下载方式一&#xff1a;方法二&#xff1a;使用 .deb 包安装 二、安装相关依赖和bcompare三、破解常见错误解决方法 ) 文件比较工具Beyond Compare是一套由Scooter Software推出的文件比较工具。主要用途是对比两个文件夹或者文件…

HCIA——30奈奎斯特定理、香农定理

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextTimer)

通过文本显示计时信息并控制其计时器状态的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextTimer(options?: TextTimerOptions) 参数&#xff1a; 参数名参数类型…

Kotlin进阶之协程从入门到放弃

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从入门到放弃 协程Coroutine是最新式的并发编程范式&#xff0c;它是纯编程语言层面的东西&#xff0c;不受制于操作系统&#xff0c;轻量级&#xff0c;易于控制&#xff0c;结构严谨&#xff0c;不易出错&#xff0c;易于…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点&#xff1a; 缺点&#xff1a; 四、改进与完事 LDM代表作 原理概括 Latent Space&#xff08;潜空间&#xff09; 五、总结 引…

提高安全投资回报:威胁建模和OPEN FAIR™风险分析

对大多数人和企业来说&#xff0c;安全意味着一种成本。但重要的是如何获得适合的量&#xff0c;而不是越多越好。然而&#xff0c;你如何决定什么时候可以有足够的安全性&#xff0c;以及你如何获得它&#xff1f;则完全是另一回事。 该篇文章是由The Open Group安全论坛主办&…

【PyTorch】进阶学习:一文详细介绍 load_state_dict() 的应用场景、实战代码示例

【PyTorch】进阶学习&#xff1a;一文详细介绍 load_state_dict() 的应用场景、实战代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图&#xff1a; 思路&#xff1a;先生成1个单位的二维码&#xff0c;然后再通过像素填充颜色&#xff0c;颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了&#xff0c;那么一直重新生成食物&#xff0c;直到生成不冲突…

GenAI开源公司汇总

主要分类如下&#xff1a; 1. 基础模型&#xff1a;这些是机器学习和AI的核心模型提供商&#xff0c;它们提供基础的算法和技术支持。 2. 模型部署与推断&#xff1a;提供云服务和计算资源&#xff0c;帮助用户部署和运行AI模型。 3. 开发者工具&#xff1a;支持AI/ML的开发…

【网络原理】TCP 协议中比较重要的一些特性(三)

目录 1、拥塞控制 2、延时应答 3、捎带应答 4、面向字节流 5、异常情况处理 5.1、其中一方出现了进程崩溃 5.2、其中一方出现关机&#xff08;正常流程的关机&#xff09; 5.3、其中一方出现断电&#xff08;直接拔电源&#xff0c;也是关机&#xff0c;更突然的关机&am…

拜占庭将军问题相关问题

1、拜占庭将军问题基本描述 问题 当我们讨论区块链共识时&#xff0c;为什么会讨论拜占庭将军问题&#xff1f; 区块链网络的本质是一个分布式系统&#xff0c;在存在恶意节点的情况下&#xff0c;希望 整个系统当中的善良节点能够对于重要的信息达成一致&#xff0c;这个机…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习&#xff1a;计时和文件处理-给算法计时-上机代码 上机代码&#xff1a; # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

第十三篇:复习Java面向对象

文章目录 一、面向对象的概念二、类和对象1. 如何定义/使用类2. 定义类的补充注意事项 三、面向对象三大特征1. 封装2. 继承2.1 例子2.2 继承类型2.3 继承的特性2.4 继承中的关键字2.4.1 extend2.4.2 implements2.4.3 super/this2.4.4 final 3. 多态4. 抽象类4.1 抽象类4.2 抽象…

微信小程序关闭首页广告

由于之前微信小程序默认开启了首页广告位。导致很多老人误入广告页的内容&#xff0c;所以想着怎么屏蔽广告。好家伙&#xff0c;搜索一圈&#xff0c;要么是用户版本的屏蔽广告&#xff0c;或者是以下一个模棱两可的答案&#xff0c;要开发者设置一下什么参数的&#xff0c;如…

ZK vs FHE

1. 引言 近期ZAMA获得7300万美金的投资&#xff0c;使得FHE获得更多关注。FHE仍处于萌芽阶段&#xff0c;是未来隐私游戏规则的改变者。FHE需与ZK和MPC一起结合&#xff0c;以发挥最大效用。如&#xff1a; Threshold FHE&#xff1a;将FHE与MPC结合&#xff0c;实现信任最小…

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单&#xff0c;但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始&#xff0c;ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…