当前位置: 首页 > news >正文

C语言模块化概述

一、函数名的意义

1.c语言是一门面向过程的语言:所谓的过程就是动词,动作。

功能块=动词1+动词2+……+动词

2.功能块:就是一堆动词(动作)的组合,动作通过函数来实现。

3.函数的功能:承上启下

承上启下,空间和空间的传递a.看 看一下 具有数据类型的空间 传递这个空间的变量名 拷贝值看,上层把我的空间传递给了下层,根本不用担心下层把我的空间改了b.改 如果让子函数修改上层空间a1.上层空间,必须把这个空间的首地址交给子函数a2.子函数拿到这个地址后,必须使用 *addr=c.具有连续数据类型的空间,指针只标记了首地址,没有标记结束标志子函数就能够拿着这个指针,不受访问的限制了,这个肯定不是空间传递的方法空间: 首地址,结束标志[个数]
  • 值传递
void t01(int b){b=20;printf("Inside t01, b = %d\n", b); // 打印t01函数内部的b的值
}void fun1(){int a=10;printf("Inside fun1, a = %d\n", a); // 打印fun1函数内部的a的值t01(a);
}
  • 地址传递
// 修改t01函数,使其接收一个整数的指针
void t01(int *b){*b = 20; // 通过解引用指针来修改b指向的值
}void fun1(){int a = 10;printf("Inside fun1, before calling t01, a = %d\n", a); // 打印a的初始值t01(&a); // 将a的地址传递给t01函数printf("Inside fun1, after calling t01, a = %d\n", a); // 打印a被修改后的值}

4.如何实现承上启下的功能?封装和调用

5.函数名的意义:标识一段空间的首地址

6.标识符:

  • 在C语言中,标识符(Identifier)是用来标识变量名、函数名、数组名、宏名等的符号。
    它们是编程语言中用于表示数据对象和函数的名称。
    以下是关于C语言中标识符的一些规则和特点:1.字母开头:标识符必须以字母(A-Z或a-z)或下划线(_)开头。2.后续字符:在第一个字符之后,标识符可以包含字母、数字(0-9)和下划线。3.大小写敏感:C语言是大小写敏感的,
    这意味着Variable和variable被视为两个不同的标识符。4.保留字:不能使用C语言的保留字作为标识符,
    例如int、if、return等。5.长度限制:标识符的长度通常有限制,虽然这个限制由编译器决定,
    但标准C语言规定前31个字符是保证有效的。6.可见性:标识符的可见性取决于它们的作用域,
    例如全局变量名在整个程序中都是可见的,而局部变量名只在定义它们的函数或代码块中可见。7.命名约定:虽然不是强制的,但通常有命名约定,
    比如驼峰命名法(camelCase)和下划线命名法(snake_case),这些约定有助于提高代码的可读性。

7.函数指针和指针函数:

  • 函数指针:存储函数地址的容器
  • 指针函数:返回地址的函数
  • //函数指针
    int (*func)(int *,...)//指针函数
    int *func(int xxx,...)

8.函数要考虑的两个问题:输入和返回

返回值 函数(输入值)

9.数组要考虑的两个问题:大小和多大的步长来访问,类比一下

10.标签:标识一段空间的首地址,就是常量指针

11.数组名和函数名,就是常量指针

12.()是运算符

13.仿函数:C语言中可以通过函数指针来实现类似仿函数的功能。函数指针可以指向不同的函数,从而在运行时根据需要调用不同的函数,这在某种程度上模拟了仿函数的行为。

14.把函数和括号看成一个整体,再向右或向左看

15.存printf

//printf是常量指针,本质上地址,可以被调用#include<stdio.h>
void test01(){printf("printf1 =%p\n",printf);
int (*my_show)(const char*,...)=(int (*)(const char*,...))(printf);
my_show("printf2 =%p\n",printf);
my_show("printf3 =%s\n","hello world");
}
int main(){test01();
}

16.数据区和代码区:基本数据类型负责数据区,函数负责代码区

17.强制类型转换:把函数声明的函数名删掉就行

int (*my_show)(const char*,...)=(int (*)(const char*,...))(printf);int a=int ;

18.函数名:本质上是地址。

  • 直接写函数名
#include<stdio.h>
void test01(){printf("printf1 =%p\n",printf);
int (*my_show)(const char*,...)=(int (*)(const char*,...))(printf);
my_show("printf2 =%p\n",printf);
my_show("printf3 =%s\n","hello world");
}
int main(){test01();
}
  • 直接写函数地址
#include<stdio.h>
void test01(){printf("printf1 =%p\n",0x00403AA0);//0x00403AA0是printf的地址
int (*my_show)(const char*,...)=(int (*)(const char*,...))(0x00403AA0);
my_show("printf2 =%p\n",0x00403AA0);
my_show("printf3 =%s\n","hello world");
}
int main(){test01();
}

19.推荐写法:typedef

typedef void(*xxx)(int); //把一个变量变为这个类型的别名void(*xxx)(int);//定义一个叫xxx的函数指针变量,这个指针按照输入参数为int
返回值为void的函数行为来调用typedef void(*xxx)(int);//定义一个叫xxx的函数指针类型的别名,这个指针按照输入参数为int
返回值为void的函数行为来调用typedef int len_t;xxx signal(int sig,xxx func);

二、函数的输入参数意义

1.一个函数就是一个独立空间,空间之间通过拷贝传递信息

2.核心就是拷贝

3.只读和可写区分开

连续空间为了避免二义性,只读和可写区分开
const int *key,int num   非字符的连续空间 只读
int *key,int num         非字符的连续空间 可写 可被修改const char*              字符的连续空间 只读
char*                    字符的连续空间 可写  可被修改             

4.strcpy和buf

三、函数返回值注意事项

1.返回值的本质:拷贝

2.面试必考的错误:

void test()
{ int a;return &a;//经典错误,a的空间还给系统了,现在&a取到的不是a的地址
}

3.函数的返回值一旦是指针,那么这个指针指向的空间绝对不是局部区域。(重要结论要记住)

4.设计接口或使用别人的接口,这个指针一定指向:

a.数据区  static  静态空间

b.堆区  malloc    动态空间 堆空间

四、多个.c的编程原理

1.工程=

A:  接口1  接口2
B:  调用接口1  调用接口2
每个接口单独编译 最后链接汇总成一个独立的可执行文件

2.如果调用不正确,会报错“undefined reference”未定义符号

3.为了方便调用,IDE(核心是工程管理器) 工程管理器(如cmake),负责:哪些文件编译,哪些不编。如果编译了,那么以什么形式编译。

相关文章:

C语言模块化概述

一、函数名的意义 1.c语言是一门面向过程的语言&#xff1a;所谓的过程就是动词&#xff0c;动作。 功能块动词1动词2……动词 2.功能块&#xff1a;就是一堆动词&#xff08;动作&#xff09;的组合&#xff0c;动作通过函数来实现。 3.函数的功能&#xff1a;承上启下 承…...

WPF 中的视觉层和逻辑层有什么区别?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;视觉层和逻辑层是两个不同的概念&#xff0c;它们分别涉及到界面的展示和应用的行为。要理解这两个层次的区别&#xff0c;我们需要从 WPF 的设计背景、架构以及它们之间的相互关系来全面分析。 …...

Kafka简单实践

使用 Apache Kafka 和 Swoole 的 PHP 实践案例 一、引言 Apache Kafka 是一个开源的分布式流处理平台&#xff0c;能够处理大量的实时数据流。由于其高吞吐量、可扩展性和持久性&#xff0c;Kafka 成为构建微服务架构和大数据处理的重要工具。Swoole 是一个高性能的异步网络通…...

JS

文章目录 项目地址一、JS1.1 if语句1.2 for循环1.2 三元表达式1.3 switch1.4 数组的push方法1.5 fuction1.5.1 arguments1.6 匿名函数1.7 预解析1.8 js对象1.8.1创建一个类1.8.2 遍历对象1.9 js的内置对象1.9.1 随机整数二、DOM2.1 获取元素2.2 事件基础2.2.1 事件三要素2.2.2 …...

【原创】java+ssm+mysql商品库存管理系统(进销存)设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…...

three.js 杂记

欧拉角旋转变换 x,y,z 弧度单位 THREE.MathUtils.DEG2RAD 度数转弧度 new THREE.Euler( - 90 * THREE.MathUtils.DEG2RAD, 0, 0 ) radius:半径 setFromSphericalCoords ( radius : Float, phi : Float, theta : Float ) : this 从球坐标中的radius、phi和theta设置该向量…...

基于Hadoop、hive的数仓搭建实践

文章目录 架构图Hadoop搭建Hive 搭建MySQL搭建官网文档下载配置配置hive环境变量配置日志文件配置hive-site 复制mysql 驱动包删除日志包初始化元数据启动metastore服务使用hive CLI启动hiveServer2访问hiveserver2客户端连接beeline shell连接 Dbeaver连接经验 基于HDFS Hive…...

新的恶意软件活动通过游戏应用程序瞄准 Windows 用户

一种新的恶意软件 Winos4.0 被积极用于网络攻击活动。FortiGuard实验室发现&#xff0c;这种先进的恶意框架是从臭名昭著的 Gh0strat 演变而来的&#xff0c;配备了模块化组件&#xff0c;可在受感染的设备上进行一系列恶意活动。 这些攻击已在游戏相关应用程序中发现&#xf…...

【Hutool系列】反射工具-ReflectUtil

前言 反射是 Java 中一种强大的机制&#xff0c;可以在运行时动态地获取类的信息并操作类的属性和方法。在 Java 中&#xff0c;通过反射可以获取和设置类的字段、调用类的方法、创建类的实例等。Java的反射机制&#xff0c;可以让语言变得更加灵活&#xff0c;对对象的操作也更…...

【操作系统专业课】第二次作业

第1题(进程同步与互斥) 使用二值信号量实现 n 个进程之间的互斥。 1. 定义一个二值信号量 mutex= 1。 二值信号量:二值信号量只有两种取值,0 (资源已被占用)和 1(资源可用)。 2. 进程进入临界区前的操作:每个进程在进入临界区之前,都需要执行 P(mutex) 操作。 P 操作…...

Scala的迭代器

1.对比foreach 它的优点在于&#xff1a; (1) 内存效率高。迭代器采用延迟计算的方式&#xff0c;它不会将整个集合加载到内存中&#xff0c;而是在每次调用next方法时才计算并返回下一个元素。 (2) 统一的遍历方法。迭代器为不同类型的集合&#xff08;如列表、集合、映射等…...

(RK3566驱动开发 - 1).pinctrl和gpio子系统

一.设备树 pinctrl部分可以参考 rockchip 官方的绑定文档 &#xff1a;kernel/Documentation/devicetree/bindings/pinctrl PIN_BANK&#xff1a;引脚所属的组 - 本次例程使用的是 GPIO3_A1 这个引脚&#xff0c;所以所属的组为 3&#xff1b; PIN_BANK_IDX&#xff1a;引脚的…...

css三角制作(二十课)

代码&#xff1a; <style>/* 边框原理 */.box1 {width: 0;height: 0;border-top: 100px solid pink;border-bottom: 100px solid blue;border-left: 100px solid yellow;border-right: 100px solid greenyellow;}/* 三角制作 */.box2 {width: 0;height: 0;border: 100px …...

C++_priority_queue(优先级队列)

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1. priority_queue的介绍和使用 priority_queue文档介绍 优先级队列的实现的关键…...

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备&#xff1a; 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…...

MySQL 的主从复制数据同步

一、什么是 MySQL 的主从复制 MySQL 的主从复制&#xff08;Master-Slave Replication&#xff09;是一种将数据从一个主数据库服务器&#xff08;主库&#xff09;复制到一个或多个从数据库服务器&#xff08;从库&#xff09;的技术。主库负责所有的数据写操作&#xff0c;从…...

python——面向对象

一、面向对象编程 1.1 面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1.1.1 面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃…...

Microsoft 365 Exchange如何设置可信发件IP白名单

1、 进入到 Microsoft 365 admin center 管理中心 &#xff0c;点击 管理中心 下的 安全 在弹出的新页面中&#xff0c;依次点击 策略和规则 – 威胁策略 – 反垃圾邮件 再单击 连接筛选器策略(默认) – 编辑连接筛选器策略 2、在 IP 允许列表 中添加可信邮件 IP 段&#xff0…...

LM27313典型电路之升压电路

下图为升压芯片LM27313典型电路图&#xff1a; 从图中可以看出&#xff1a;系统电压VSYS3.7伏&#xff0c;通过C26与C27两个滤波电容后&#xff0c;到达升压芯片的VIN输入脚pin5。 其中电源芯片的电压输出由下式子决定&#xff1a; VOUT1.23*(1R17/R21) 其中VOUT是图中的V5D…...

嵌入式面试八股文(七)·#ifndef#define#endif的作用、以及内存分区(全局区、堆区、栈区、代码区)

目录 1. 头文件中的#ifndef / #define / #endif的作用是什么&#xff1f; 2. 内存分区&#xff1a;全局区、堆区、栈区、代码区简单描述&#xff1f; 2.1 代码区&#xff08;Text Segment&#xff09;&#xff1a; 2.2 全局区&#xff08;Data Segment&#xff09;&…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...