[朝花夕拾C语言]:指针的进阶学习

《测绘综合能力》——大地测量 《测绘综合能力》大地测量 部分重要(常考)知识点(精简版)。 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

提示:这里可以添加本文要记录的大概内容:

       对于C语言来讲,好多人都认为指针是C语言的灵魂,根据小菜鸡我的最近学习,确实的的确确的感受到了来自C语言指针的折磨与坎坷,指针它就在那里,你学与不学,它依然在。

       也许和好多人都在讲:当你精通C语言的指针后,这就是10w和30w的差别,虽然有点夸张,但是确实现在的社会就是这样,会就是生产力,不会,你就卷铺盖滚蛋吧!


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针到底是个啥呢?

到现在为止,我认为:指针是用来表示内存地址的一个代号,对,就是一个代号而已,也许只是好多人被后面的知识点的复杂给害怕了! 它:就是一个表示内存地址的工具而已!

int main()
{
    int a =10;
    int* p=&a;
        *p=20;
    printf("%d",*p);
    printf("%d",a);
    rerturn 0;
}

就比如现在这个代码,好多同学刚开始接触到C语言的指针,都是这种很简单的形式接触到的,感觉也没有这么难嘛!以为就这,对哈 ,单单就这样的难度,还真是就这而已!

下面简单说下:用学过的知识点类比一下数组指针

int main()
{
	//字符指针
	char ch = 'w';
	char* p = &ch;
	const char* p2 = "abcdef";
	//指针的数组-数组-存放指针的数组
	int* arr[10];
	char* ch[5];
	//数组指针
	int* p3;//指向整型的指针
	char* p4;// 字符的指针
	int arr2[5];//数组
	int(*pa)[5] = &arr2;//数组的指针,

	return 0;

}

二、指针进阶后的学习:

对于这块内容,小菜鸡本人跟着学习了好几天感觉一直在慢慢的绕着,本来不想写博客,但是真的是学而不思则罔,感觉还是有必要慢慢试着把一天学习的知识点,给好好记录下来啊!

对于下面的 1.数组  2.指针数组  3.数组指针  4.函数指针 5.函数指针数组 肯定也有好多小伙伴跟我一样也是傻傻的分不清,我也想把自己的理解分享给大家;

int main()
{
    int arr[10];//数组:含有10个元素的整型数组
    
    int* pa[10];//指针数组:pa是数组的名字,里面有10个元素,int*表示的是指向整型的指针

    int(*pb)[10];//数组指针:(*pb)两个优先结合,表明是该类型是个指针,元素是10个, 
                     指向的类型是整型为int

    int(*pc)(int x ,int y);//函数指针:(*pc)该类型是个指针,后面调用的参数为(int x,int y)
                             最后的返回类型为int类型   

    int(*pf[4])(int x ,int y);//函数指针数组:(*pf[4])是一个有4个元素的指针数组,
                                 调用的参数为(int x,int y),最后的返回类型为int类型

    return 0;
}

2.1 函数指针的应用

对于函数指针的使用 ,通过调用函数指针可以很方便的实现需要的功能:

void print(char* str)
{
	printf("%s\n", str);

}
int main()
{
	void (*p)(char*) = print;//调用相应的print函数进行打印
	//*p 是指针 指向的函数类型是char* 返回类型为void
	(*p)("hehe");
	return 0;
}

最后结果打印出来是:

test
hehe:bit

我们简单来分析一下:这里的*p 是指针,指向的函数类型是char* ,返回类型为void,当(*p)使用时调用print函数,print括号里面的参数是一个字符,类型是char*,组的使用

2.2 函数指针数组的使用

对于函数指针数组,这个工具用起来可以更好的帮助我们减少代码的书写:代码是用来运行的,不是用来堆叠的!

#include <stdio.h>
#include <string.h>

int add(int x, int y)
{

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

	return  x - y;
}
int mul(int x, int y)
{

	return  x * y;
}
int div(int x, int y)
{

	return  x / y;
}
int main()
{
	
	int (*parr[4])(int, int) = {add,sub,mul,div};//add-1 sub-2 mul-3 div-4
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d\n",parr[i](6, 3));// 根据指针找到相应的地址
		                             //进行相应的加减乘除的运算!
	
	}
	 
	return 0;
}

这行代码:int (*parr[4])(int, int) = {add,sub,mul,div};//add-1 sub-2 mul-3 div-4 其实主要是将后面的加减乘除通过一个函数指针数组全部放在一起,正如我们上面讲的:int(*pf[4])(int x ,int y);//函数指针数组:(*pf[4])是一个有4个元素的指针数组,调用的参数为(int x,int y),最后的返回类型为int类型,我们后面只需要找到对应的【i】的值,就能通过找到函数的地址,来调用函数,来实现应用。

再比如说,我们可以换种方式对加减乘除进行优化:

void menu()
{
	printf("**********************\n");
	printf("*1.add    2.sub*******\n");
	printf("*3.mul    4.div*******\n");
	printf("*5.xor    0.exit  ****\n");
	printf("**********************\n");
}
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
int xor (int x, int y)
{
	return x ^ y;
}

void clc(int (*pf)(int x, int y))//仍然是使用其相应的函数指针的知识!
{
	int x = 0;
	int y = 0;
	printf("请输入两个操作数:>");
	scanf("%d%d", &x, &y);
	printf("%d\n", pf(x, y));


}
int main()
{
	
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			clc(add);
			break;
		case 2:
			clc(sub);
			break;
		case 3:
			clc(mul);
			break;
		case 4:
			clc(div);
			break;
		}
	
	} while (input);

	return 0;
}

我们可以通过封装函数clc(add/sub/mul/div)里面的其中一种就可以进行调用,而void clc(int (*pf)(int x, int y))//仍然是使用其相应的函数指针的知识!利用(*pf)作为指针,参数类型为(int x,int y)返回值为void,在使用指针的时候也同时调用其余的四个函数进行运算!

总结

提示:这里对文章进行总结:
上面介绍了:1.数组 2.数组指针 3.指针数组 4.函数指针 5.函数指针数组 的基本概念和应用,第一篇博客刚刚开始写,还有好多不熟练,希望后面,能给大家创作出更多优质的文章,谢谢!2022年5月31号 人才公寓隔离点书写!

ArcGIS Pro符号化教程 本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。 阅读详情

相关推荐

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

本文介绍如何利用Qoder、阿里云 ADB Supabase 和通义千问图像编辑模型,快速构建AI手办生图Flutter应用。无需传统后端,通过AI生成代码、BaaS服务与边缘函数调用,实现从原型到上线的敏捷开发,全流程轻量高效,助力Vibe Coding落地实践。

数据库技术 931

朝花夕拾 · C语言 | 指针篇

基类型 *变量名;基类型:该指针指向的空间存储的数据的数据类型:int、char、float 、double 、void、构造数据类型* : 类型说明符,说明后面的变量是一个指针变量名:遵循标识符的命名规则p开头指针变量中保存的地址,是该数据类型的首地址。

Vvc_Python的博客 409

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 350

朝花夕拾 · C语言 | 基础篇

你是否曾与C语言初次相遇,许多概念一知半解。如今带你重走来时路,从头梳理语法、指针、内存、结构体等,陪你扫清底层盲区,为嵌入式开发筑牢根基。以此系列博客,记录复盘全过程。

Vvc_Python的博客 390

【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作...

写在前面: ???? 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。???? ???? 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 ????感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~文章目录引言一、油门标定原理1.1 油门与速度、加速度的关系1.2 油门控制曲面模型的构建二、油门标定表的制作流程...

qq_35485206的博客 2139

CAN开发笔记(TI开发者推荐笔记)

查阅了很多资料没有查阅到关于5728芯片CAN模块寄存器的介绍,希望通过本文能给做CAN驱动的后来者有一点参考意义,我也是刚接触CAN模块有些不足请各位多多指正。 由下图所示是CAN模块初始化流程图 首先要开始初始化,设置CAN位时间,然后配置message objects, 完成初始化。 1.开始初始化 首先要控制DCAN_CTL 寄存器,该寄存器是CAN模块的总控制器,很多配置通过...

weixin_44316996的博客 3562

C语言之精华总结!

 从研究生二年纪开始学习计算机也差不多两年了,一路走来,有很多的收获,也有不少的遗憾,现在正好有一段闲暇,就想对走过的路留下一些足迹,回忆。每个人都有自己不同的人生,说到这里,就是程序人生了,歌德在《浮士德》中说过:“如果不曾在悲哀中咀嚼过面包,不曾在哭泣中等待过明天,这样的人就不知道你——天的力量。”所以我想记下一些带给我悲哀,带给我哭泣的程序人生。其实学习计算机的基础课程是非常重要的,离散数学

WiZiM404.COM 2431

NRF24L01模块的5个常见问题及解决方案:从信号干扰到功耗优化

本文深入探讨NRF24L01无线模块在STM32开发中的5大常见问题及解决方案,包括通信距离优化、数据丢失排查、电源噪声抑制、SPI通信故障处理以及低功耗设计。通过代码示例和电路图分析,提供实用的优化策略,帮助开发者提升无线通信的稳定性和效率。

weixin_28256233的博客 226

朝花夕拾 · C语言 | 数组篇

数组一般形式:类型说明符 数组名 [常量或常量表达式];类型说明符:基本数据类型、构造数据类型(不能是void类型)。说明数组中保存的数据的数据类型。数组名:遵循标识符的命名规则。常量或常量表达式:数组中可以保存的元素的个数。int a[10];sizeof (a);//40字节//32字节//20字节注意:常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的。

Vvc_Python的博客 719

全志A133的AndroidSDK

本小节来学习如何下载全志安卓SDK,SDK的目录,编译和烧录提示:以下是本篇文章正文内容,下面案例可供参考以上就是整个SDK的目录和编译烧录,目的在于让初学者快速了解整个源码的目录和编译出镜像喜欢就订阅吧。

qq_24093081的博客 4054

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2187

【朝花夕拾】智能指针使用

智能指针的使用及其原理智能指针的原理智能指针的使用boost库分类及说明使用示例其中的坑C++标注库库分类及使用使用示例其中的坑智能指针的实现原理及代码解析 注:本篇耗时较久,先发一部分,每天补一部分 如果说C++对新手最不友好的东西是什么的话,那么堆内存绝对排的上号,初级西甲甲开发工程师们在内存泄漏野指针等问题中水深火热中,甚至于西甲甲老手们都不可避免的忘记释放内存,那么智能指针就是挽救你于水火之中的一个好工具,使用智能指针我们可以轻松的使用指针变量而不用担心内存释放问题。 智能指针的原理 由于对上分配的

心若微尘的博客 385

倍福--RS232自由口实现

RS232/485通信协议是在现场中常用到的,比如触摸屏、温控模块等设备控控制器做通信,会常用到此类协议,本文介绍RS232/485自由口通信的实现,并用PC调试助手进行测试。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制器软件 3 硬件连接 3 2.1. PC COM介绍 3 2.2. RS232/RS485连接 3 3.2.1. N030…………. 4 3.2.2. N031…………. 4 2.3. 实际线路连接 5 PLC程序 7 3

weixin_41883890的博客 3284

朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答1...

朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答1 = = =   选择题(提示:答案只有一个): int *p = 100; 到底是下面哪个呢? 答案A:    (int *) p 答案B:     int (*p)   答案是B。   一定要分清楚指针定义和变量类型的关系。 指针定义的方式是在普通定义方法的变量名前加*。 普通定义的方...

fantaxy025025的专栏 264

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

朝花夕拾 · C语言 | 结构体篇

int num;结构体类型 变量名;int mon;int day;}mydate;

Vvc_Python的博客 357

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答...

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答 = = = 选择题(提示:答案只有一个): int *p = 100; 到底是下面哪个呢? 答案A: (int *) p 答案B: int (*p) 答案是B。 一定要分清楚指针定义和变量类型的关系。 指针定义的方式是在普通定义方法的变量名前加*。 普通定义的方式为...

weixin_30840253的博客 131

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2...

= = = 朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2 这一篇主要目标讲多维数组和指针类型。   原理1:C语言中只有一维数组。2维数组可以看成是一维数组的一维数组。多维数组以此类推。 原理1:C语言中只有一维数组,:数组名称后面跟着的第一个数字维度就是数组的真实维度。除此之外,其他的参数则是数组元素的信息描述。 C语言中只有一维数组,而且数组的...

fantaxy025025的专栏 308

【朝花夕拾】C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2...

= = = 朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答2 这一篇主要目标讲多维数组和指针类型。 原理1:C语言中只有一维数组。2维数组可以看成是一维数组的一维数组。多维数组以此类推。 原理1:C语言中只有一维数组,:数组名称后面跟着的第一个数字维度就是数组的真实维度。除此之外,其他的参数则是数组元素的信息描述。 C语言中只有一维数组,而且数组的大...

weixin_30820151的博客 140

[朝花夕拾C语言]:排序函数qsort详细讲解

通过对: 1.整型冒泡排序; 2.qsort函数对于排序捷运用,其中通过建立结构体指针,对相同的项进行比较; 3.对sizeof()和stelrn()的基本概念和基本运用的分析。 加深理解!

qq_44838021的博客 570

C语言之诡异

"C之诡谲"C语言之精华总结!C之诡谲(上)从研究生二年纪开始学习计算机也差不多两年了,一路走来,有很多的收获,也有不少的遗憾,现在正好有一段闲暇,就想对走过的路留下一些足迹,回忆。每个人都有自己不同的人生,说到这里,就是程序人生了,歌德在《浮士德》中说过:“如果不曾在悲哀中咀嚼过面包,不曾在哭泣中等待过明天,这样的人就不知道你——天的力量。”所以我想记下一些带给我悲哀,带给我哭泣的程序人生。

haoyuenan的专栏 2249

C语言一文速成 | 期末保命夺分神器!

用户编程时使用的名字函数声明:在使用函数前,需要声明他的返回类型和参数列表//返回值 函数名(参数列表);函数定义:完整的函数实现,包括函数体。return a+b;数组是一种数据结构,用于存储一组相同类型的数据数组中的元素在内存中是连续存放的数组通过下标来访问元素,下标从0开始。

爱因斯晨的博客 1239

C语言中常见的容易模糊概念

目的 主要是讲解C语言中容易混淆术语概念, 指针数组, 数组指针, 指针函数, 函数指针,指针常量, 常量指针。如果不常用 我偶尔也会忘记, 所以想朝花夕拾, 偶尔能够翻来看看, 说不定还能达到温故而知新。 概念解释 名词 名词解释 指针常量 本质是一个常量,只不过这个常量是指针类型 常量指针 本质是一个指针,只不过这个指针是指向常量 函数指针 本质是一个指针,只不过这个指针指向函数 指针函数 本质是一个函数,只不过返回指针类型 数组指针 本质上是一个指针,只不过该指针指向数

liunanya的博客 232

朝花夕拾 · C语言 | 函数篇

此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。域宽输出: 7. %nd 以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空。

Vvc_Python的博客 349

C语言指针数组和数组指针-摘-有改动和添加

= 本文讲的还是算不错的。但是有些地方不对,已经在上一篇文更正并优化了。可以看一下: 朝花夕拾-C语言指针定义和数组定义的歧义问题-指针和数组疑难辩证-终极解答 = from:http://c.biancheng.net/cpp/html/476.html C语言指针数组和数组指针 一、指针数组和数组指针的内存布局 初学者总是分不出指针数组与数组指针的区别。其实很好理解:指针数组:...

fantaxy025025的专栏 437

朝花夕拾--C++再学习

一,寻址 通过变量名 通过内存地址 取地址运算符&amp;,用来获得变量的地址. void getAddress() { int var; cout&lt;&lt;"var address is: "&lt;&lt;&amp;var&lt;&lt;endl; } 输出结果是:var address is: 0x7ffcf4dd4e14 为何这里是12位的16进制呢,换成2进制就是4...

Dive Deep into The Knowledge 429

【朝花夕拾】C语言-空白与注释

从严格意义上来说,C语言并没有如Python那样严格的缩进限制,所以你可以很自由的编写你的代码。但是,那样会导致你的代码可读性非常差,当你的程序出现了BUG,想要调试的时候,你会发现自己都不知道自己写的是什么了。因此一个良好的编码习惯显得尤为重要,不为了别人,就为了我们自己能够很好的DEBUG,我们也应该养成一个良好的编码习惯。 一、合理的使用注释 注释分为行注释和块注释,所有的注释都会被预处

心若微尘的博客 1183
下一篇: [朝花夕拾C语言]:排序函数qsort详细讲解
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值