C语言进阶02

C语言书籍推荐从入门到进阶再到封神全套(2021年整理) 一、C语言书籍推荐入门,初学,编程基础系列 1、《C语言程序设计:现代方法》(第2版) 时至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经和最初的时候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库和参考资料 4个部分。每章末尾都有一个“问与答”小节给出一系列与 阅读详情

本部分包含指针进阶。字符指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针、回调指针、回调函数。

笔记部分:

  • 1. 字符指针
    • 例题:

    • 解析:
      • 这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块,所以str1和str2不同,str3和str4相同。
  • 2. 指针数组
    • 示例:

    • 图示:

  • 3. 数组指针
    • 数组指针的定义 :是指向数组的指针。数组指针是指针。
    • &数组名VS数组名
      • 数组名表示数组首元素的地址。
      • &arr 表示的是数组的地址,而不是数组首元素的地址。
    • 数组指针的使用
      • 数组指针中存放的是数组的地址。
  • 4. 数组传参和指针传参
  • 5. 函数指针
    • 一维数组图示:

    • 二维数组传参

    • 一级指针传参

    • 二级指针传参

  • 6. 函数指针数组
    • 函数指针
      • 函数指针:存放函数地址的指针
      • &函数名,取的是函数的地址。函数名本身就是地址。
      • 函数指针的定义:返回值类型 (*函数指针变量名)(参数类型)=&函数名;
      • 图示:

    • 函数指针数组
      • 语法:返回值类型 (*函数指针变量名)(参数类型)=&函数名;
      • 函数指针数组的用途:转移表
  • 7. 指向函数指针数组的指针
    • 指向函数指针数组的指针是一个 指针
    • 指针指向一个 数组 ,数组的元素都是 函数指针

  • 8. 回调函数
    • 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

代码部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void print1(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 print2(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");
	}
}

//计算器
void menu()
{
	printf("***********************\n");
	printf("*****1.add    2.sub****\n");
	printf("*****3.mul    4.div****\n");
	printf("*****     0.exit   ****\n");
	printf("***********************\n");
}

int Add(int a, int b)
{
	return a + b;
}

int Sub(int a, int b)
{
	return a - b;
}

int Mul(int a, int b)
{
	return a * b;
}

int Div(int a, int b)
{
	return a / b;
}

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

int main()
{
	////字符指针
	//char str1[] = "hello bit.";
	//char str2[] = "hello bit.";
	//const char* str3 = "hello bit.";
	//const char* str4 = "hello bit.";
	//if (str1 == str2)
	//	printf("str1 and str2 are same\n");
	//else
	//	printf("str1 and str2 are not same\n");

	//if (str3 == str4)
	//	printf("str3 and str4 are same\n");
	//else
	//	printf("str3 and str4 are not same\n");


	////指针数组
	//int a[] = { 1,2,3,4,5,6 };
	//int b[] = { 2,3,4,5,6,7 };
	//int* p1[5] = { a,b };
	//for (int i = 0;i < 2;i++)
	//{
	//	for (int j = 0;j < 6;j++)
	//	{
	//		printf("%d", *(p1[i] + j));
	//		//printf("%d", *arr[i][j]);
	//	}
	//	printf("\n");
	//}

	////数组指针
	//int* c[4];
	//int* (*pc)[4] = &c;

	//int d[10] = { 1,2,3,4,5 };
	//int(*pd)[10] = &d;

	//int* e[3][5] = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
	//print1(e, 3, 5);
	//print2(e, 3, 5);


	////函数指针
	//void (*ppr)(int, int, int) = print1;
	//ppr(e, 3, 5);

	////函数指针数组
	//int (*prArr[2])(int, int, int) = { print1,print2 };
	//计算器
	
	
	int input = 0;
	do
	{
		menu();
		printf("请输入》\n");
		scanf("%d", &input);
		int (*pfArr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
		int x, y;
		if (input > 0 && input < 5)
		{
			printf("请输入两个操作符\n");
			scanf("%d %d", &x, &y);
			int ret = (*pfArr[input])(x, y);
			printf("结果为%d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出程序");
		}
		else
		{
			printf("输入错误,请重输");
		}
	} while (input);

	//qsort()快速排序
	int arr1[] = { 1,3,2,4,5 };
	int size = sizeof(arr1) / sizeof(arr1[0]);
	qsort(arr1,size,sizeof(arr1[0]),cmp_int);
	return 0;
}

12、无人机系统的建模与仿真 本文深入探讨了无人机系统的建模与仿真技术,涵盖其发展需求、历史演变、动力学建模方法、常用参考框架与状态变量表示,并分析了在控制系统设计、操作员培训和子系统测试中的关键应用。文章还介绍了不同类型无人机(固定翼、旋翼、混合翼)在建模与仿真中的差异,提出了多学科融合、高精度实时仿真及VR/AR技术等未来发展趋势,并给出了实际建模与仿真的标准操作流程,为无人机系统的设计与优化提供了全面的技术支持与展望。 阅读详情

相关推荐

瑞芯微RK3568开发板实战:Android11系统parameter.txt文件配置全解析(附常见问题排查)

本文深入解析了瑞芯微RK3568开发板在Android 11系统下parameter.txt文件的配置要点与实战技巧。作为BootLoader启动阶段的核心蓝图,该文件决定了硬件初始化、分区布局及电源管理。文章详细拆解了身份标识、GPIO控制(PWR_HLD)、命令行参数及分区表等关键字段的配置逻辑,并针对RK3568平台与Android 11特性提供了专项适配策略,最后附带了启动失败、分区异常等常见问题的深度排查方法。

php55的博客 896

C语言进阶 - 指针(4):回调函数

指向函数指针数组的指针和回调函数的介绍。

Fighting!!! 1229

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 208

C语言回调函数的理解(函数指针)

描述 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #i...

小白的Coding之旅 1138

记一次Redis出问题及解决方案

Q1: redis服务关闭前确认数据还是在的,重启后发现一条数据都没了,key* 查也是空的 A1: 经仔细检查发现redis.conf配置文件配置的数据存储目录配置的是dir ./ 也就是相对目录,也就是说在哪个目录执行redis-server redis.config启动命令 redis数据就会存到哪个目录,同样就会加载哪个目录下的数据文件(dump.rdb),前后两次启动命令的位置不一样导致第二次启动没有加载到(dump.rdb)文件,从而导致查不出数据 Q2:springboot 集成r

u010013928的博客 3059

Windows下快速搭建Kettle开发环境:基于9.4.0.0版本的保姆级教程

本文提供Windows系统下Kettle 9.4.0.0开发环境的详细搭建指南,涵盖源码获取、Maven配置优化、高效编译及部署运行全流程。通过实战验证的步骤和常见问题解决方案,帮助数据工程师快速完成环境配置,提升ETL开发效率。

weixin_28829479的博客 332

C语言:回调函数的理解

理解回调函数的使用  回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给 另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 举例: 使用qsort函数排序各种类型的数据  # include &lt;stdio.h&gt...

qq_42270373的博客 415

基于YOLOv8的铁路轨道异物检测系统设计与实现

目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。

YOLO 574

c语言回调函数 有什么作用,C语言中的回调函数及应用场景

1.回调函数:如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,即调用者提供一个函数但自己不去调用它,而是让实现者去调用它,这称为回调函数(Callback Function)。2. 以上的概念叙述很难让你明白,回调函数到底是怎么一回事儿,下面我通过一个实例描述一下,请耐心看下去:此示例由三个文件组成:para_callback.h、para_callback.c、callback.c...

weixin_39607447的博客 851

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

4、硬件工程师笔试面试知识器件篇——电阻(2025版本)

本文系统介绍了电阻的基础知识与应用。首先阐述了电阻的定义、工作原理及类型(固定/可变电阻),详细说明了常见电阻材料(碳膜、金属膜、线绕等)的特性与标记方法。重点分析了电阻在电路设计中的关键参数:功率计算需考虑1.5-2倍安全裕度,温度系数影响电路稳定性。文章还对比了不同封装形式(轴向/贴片/功率封装等)的适用场景,特别强调高功率电路需选择专用封装并做好散热设计。最后指出电路仿真可优化电阻选择,并列举了相关电子元件在设计中同样需要仿真验证。全文为硬件工程师提供了电阻选型的实用指导。

XU157303764的博客 5213

【C语言】深入解析C语言中的回调函数及其应用

回调函数的概念可能有些抽象,让我们尝试用一个简单的生活场景来解释它。假设你有一项重要任务需要完成,但任务的一部分要依赖于其他人完成的工作。你可以留下一个手机号码,当对方完成任务后,他们会给你打电话通知你。在这个场景中,你的手机号就是回调函数,你留给对方的方式告诉他们完成任务后与你联系。

Goforyouqp的博客 1万+

微信小程序启用蓝牙设备特征值变化时的notify功能

注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。

wsk198726的专栏 1173

C语言进阶——02

打个草稿

weixin_42132823的博客 1388

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言指针进阶02

指针进阶笔记

m0_73793970的博客 168

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C语言进阶02-变量与内存、文件

C语言基础-变量与内存管理一、基本概念变量全局变量(外部变量)局部变量(自动变量)静态变量内存四区代码区(1)数据区静态区(2):全局、静态变量动态区栈区(3):局部变量、函数形参堆区(4):手动完成malloc与free 一、基本概念 变量 一个有名字的,具有具体属性的一个存储单元。 可以理解为内存,变量的功能就是存储数据,程序运行时其值可以改变,。 每个变量都有特定的类型,类型决定了变量存储的...

谅至的博客 633

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言进阶02-栈内存

01 值和地址 程序和数据在计算机中是存储在一个叫存储器的地方. 没有存储器, 计算机就不能计算, 因为没地方计算(这不是废话吗). 像内存称为易失的存储器, 硬盘称为非易失的存储器. 其中SSD又叫闪存. 计算机的内存被编组成地址-值的关系对. 如: 学生的姓名和所在大学的院系之间的关系. 1、小明: 清华大学计算机系 2、小李: 北京大学计算机系 等等. 计算机内存中, 每个位置存储的不是0就是1, 如下面这样: 1、0存储在第1个位置. 2、0存储在第2个位置. 3、1存储在第3个位置. 4、0存储在

m0_37759287的博客 359

C语言进阶剖析 02 有符号与无符号

计算机中的符号位 最高位1, 表明这个数为负数 最高位0, 标识这个数为正数 int sign = 0; char i = -5; short j = 5; int k = -1; sign = (i &amp;amp;amp; 0x80); // sign 不等于0 sign = (j &amp;amp;amp; 0x8000); // sign 等于0 sign = (k &amp;amp;amp; 0x80...

Linux Openharmony Android Graphics Stack! 916

【C语言学习笔记---指针进阶02】

初识C语言学习笔记Vlog---026C语言指针进阶之回调函数

m0_69455439的博客 338

C语言入门:进阶篇02 进程

本文主要是一些程序员内功:进程、标识符等。

snowysc的博客 113

C语言进阶——有符号与无符号02

在计算机的内部,我们所有的信息都是由二进制数字组成的 有符号数的表实法: 在计算机内部用补码的方式表实有符号数 正数的补码位正数的本身 负数的补码为其绝对值取反然后加一得到 例如-7 他在计算机内部的是1111 1001 是这样得到的 7-》111-》0000 0111-》1111 1000-》1111 1001 无符号整数的表示: 在计算机内部用原码表...

weixin_30608503的博客 134

C语言day02(Linux进阶)

Linux进阶 编号 命令 介绍 1 whoami 查看当前用户 2 who 显示当前已登陆用户信息 3 exit 退出 a 如果当前为图形界面时,退出当前终端。 b 如果使用SSH远程登陆,退出登陆账户。 c 如果是切换后的登陆用户,退出则返回上一个登陆账号。 4

前端一同天下,JS永葆青春。 246

02_C 语言进阶之避坑指南:数组越界 —— 嵌入式开发的 “隐形炸弹”

C 语言不做数组边界检查,把 “边界控制” 的责任完全交给开发者 —— 这既是 C 语言高效的原因,也是越界 BUG 的根源。嵌入式开发中,数组越界的危害远大于桌面端,因为内存资源有限、硬件关联性强,一次越界可能导致设备死机、数据丢失甚至硬件损坏。避开数组越界的核心,不是 “记住多少坑点”,而是建立“边界意识”任何时候访问数组,先想 “下标是否在合法范围”,再写代码。当你把 “边界校验” 变成肌肉记忆,数组越界这颗 “隐形炸弹”,就再也没有引爆的机会。

C语言无原生OOP特性,却能借结构体+函数指针实现封装、继承、多态,落地工厂等设计模式。博客中以标准C语法实操教学,融入跨平台兼容设计,助开发者掌握C语言OOP核心与工程实践技巧。 1199

02_C 语言进阶之面向对象编程:函数指针打造可扩展嵌入式架构

接口抽象的核心是 “定义统一调用标准,屏蔽不同实现的细节”,这在多模块协作、多人开发的储能 PCS 项目中至关重要。// 定义控制算法函数指针类型(统一接口规范)// 初始化// 计算控制量// 销毁资源// 控制算法接口结构体(封装所有行为接口)// 初始化接口// 计算接口// 销毁接口// 算法公共数据(所有算法都需要的属性)float kp;float ki;float kd;// 指向算法私有数据(如MPC的预测步长、PID的积分限幅)

C语言无原生OOP特性,却能借结构体+函数指针实现封装、继承、多态,落地工厂等设计模式。博客中以标准C语法实操教学,融入跨平台兼容设计,助开发者掌握C语言OOP核心与工程实践技巧。 1220

软件协会第01次活动第02次任务布置:初识C语言与C语言三大基本结构

⏲ 时间:🏠 官网:https://www.csuftsap.cn/gitee腾讯云cos阿里云oss空代码块空引用框💬 一些话:这是软件协会第一次代码训练,以下给出的都是经典题目,希望大家都做一做,另外,进阶训练可能现在来说对大家有点难度,但不要怕,你不会就应该去学习。这些题都是你以后会多次碰见的,那为什么不现在就掌握呢?千万不要去抄别人的代码,一定要自己能独立的写出来,软件协会做这些都是希望大家的能力能够真正的提升,如果有什么不理解的地方最好先独立思考再问。加油,你是最棒的。🚀。

是谢添啊 1569

【C语言进阶】指针的进阶【上篇】

本文讲解了指针的进阶中的字符指针,数组指针,指针数组,数组传参和指针传参等一系列的知识,图文并茂,让你可以看懂并且理解

你我皆为凡人的博客 1545
上一篇: C语言进阶学习01
下一篇: C#基础学习教程
Ohrkaninchen
博客等级 码龄5年 18粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ohrkaninchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值