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),负责:哪些文件编译,哪些不编。如果编译了,那么以什么形式编译。

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

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

相关文章

在Ubuntu22.04上源码构建ROS noetic环境

Ubuntu22.04上源码构建ROS noetic 起因准备环境创建工作目录并下载源码安装编译依赖包安装ros_comm和rosconsole包的两个补丁并修改pluginlib包的CMakeLists的编译器版本编译安装ROS noetic和ros_test验证 起因 最近在研究VINS-Mono从ROS移植到ROS2&#xff0c;发现在编写feat…

【linux学习指南】VSCode部署Ubantu云服务器,与Xshell进行本地通信文件编写

文章目录 &#x1f4dd;前言&#x1f320; 步骤&#x1f309;测试同步 &#x1f6a9;总结 &#x1f4dd;前言 本文目的是讲使用Vscode连接Ubantu,与本地Xshell建立通信同步文件编写。 查看本机系统相关信息&#xff1a; cat /etc/lsb*DISTRIB_IDUbuntu: 表示这是 Ubuntu 发行…

【JavaSE线程知识总结】

多线程 一.创建线程1.多线程创建方式一(Thread)2.多线程创键方式二(Runnable)3.线程创建方式三 二.线程安全问题解决办法1.使用同步代码块synchornized 2 .使用Lock解决线程安全问题 三.总结 线程就是程序内部的一条执行流程 一.创建线程 常用的方法 Thread.currentThread()…

用OMS进行 OceanBase 租户间数据迁移的测评

基本概念 OceanBase迁移服务&#xff08;&#xff0c;简称OMS&#xff09;&#xff0c;可以让用户在同构或异构 RDBMS 与OceanBase 数据库之间进行数据交互&#xff0c;支持数据的在线迁移&#xff0c;以及实时增量同步的复制功能。 OMS 提供了可视化的集中管控平台&#xff…

第一个 Flutter 项目(1)共46节

前端开发工具vs code&#xff0c;安装Flutter sdk&#xff0c;如果你的下载速度比较慢&#xff0c;可以选择这个&#x1f604; flutter sdk 解压码&#xff1a;stwq 配置可以看这Flutter 新建工程一直等待 解决办法-CSDN博客 如果你是新的 Flutter 开发者&#xff0c;我们建…

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…

高级数据结构——hash表与布隆过滤器

文章目录 hash表与布隆过滤器1. hash函数2. 选择hash函数3. 散列冲突3.1 负载因子3.2 冲突解决3. STL中的散列表 4. 布隆过滤器4.1 背景1. 应用场景2. 常见的处理场景&#xff1a; 4.2 布隆过滤器构成4.3 原理4.4 应用分析4.5 要点 5. 分布式一致性hash5.1 缓存失效问题 6. 大数…

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签&#xff0c;也就没有 DOM 和 BOM&#xff0c;CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写&#xff0c;WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构&#xff0c;小程序中标签称为组件…

[Linux]多线程详解

多线程 1.线程的概念和理解1.1线程的优点1.2线程的缺点1.3线程的设计1.4线程 VS 进程 2.线程控制2.1线程等待2.2 线程终止2.3 线程分离 3.线程互斥3.1背景3.2抢票代码演示3.3保护公共资源&#xff08;加锁&#xff09;3.3.1创建锁/销毁锁3.3.2申请锁/尝试申请锁/解锁 3.4解决抢…

CSP-J 2024题解

省流&#xff1a;300->260 乐。 Poker: 我考场上寻思着会不会有人写成了 joker.in joker.out&#xff0c;结果真的有 joker Sol EZ problem&#xff0c;拿 set 搞一下就行了&#xff08;虽然我赛事没想到&#xff0c;用了 map&#xff09; Code #include <bits/std…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

python机器人Agent编程——多Agent框架的底层逻辑(上)

目录 一、前言二、两个核心概念2.1 Routines&#xff08;1&#xff09;清晰的Prompt&#xff08;2&#xff09;工具调用json schema自动生成&#xff08;3&#xff09;解析模型的toolcall指令&#xff08;4&#xff09;单Agent的循环决策与输出 PS.扩展阅读ps1.六自由度机器人相…

达梦 DG

监视器 switchover 关于达梦DG switchover的细节&#xff0c;以下是一些关键步骤和注意事项&#xff1a; • 切换前检查确认&#xff1a; • 确认数据库版本和DG架构&#xff0c;包括IP信息及切换角色前后的情况。 • 检查DG切换方式&#xff0c;是switch over还是fail ove…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

从零开始的c++之旅——二叉搜索树

1、二叉搜索树概念 1. ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有结…

类与对象;

目录 一、认识类&#xff1b; 1、类的引入&#xff1b; 2、类的定义&#xff1b; 类的两种定义方式&#xff1a; 3、类的访问限定符及封装&#xff1b; 4、类的作用域&#xff1b; 5、类的实例化&#xff1b; 6、类对象模型&#xff1b; 计算类对象的大小&#xff1b; …

ceph的集群管理

0 环境说明 ip地址主机名额外硬盘是否加入ceph集群10.0.0.141ceph141sdb 300G&#xff0c;sdc 500G是10.0.0.142ceph142sdb 300G&#xff0c;sdc 500G, sdd 1000G否10.0.0.143ceph143sdb 300G&#xff0c;sdc 500G否 在上一篇文章中&#xff0c;已经成功地初始化了一个ceph管…

企业无线解决方案

前言 无线广域网 无线广域网WWAN&#xff08;Wireless Wide Area Network&#xff09;目前已经成为了全球通信系统的核心组成部分&#xff0c;我们所熟悉的2G网络、3G网络和4G网络&#xff08;LTE&#xff09;等等都是WWAN的典型代表。通过WWAN&#xff0c;用户几乎可以在任何…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…