嵌入式初学-C语言-十六

news2025/1/12 1:00:48

形式参数和实际参数

形式参数(形参)

       函数定义时,指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当函数调用时,系统才会为形参申请内存,用于存储实际参数,并且当函数返回,系统会自动回收,为形参申请的内存资源(本质上所有函数都有return返回,只不过当我们的函数返回类型是void的时候,return关键字被省略了)

实际参数(实参)

1. 函数调用时,主调函数传递的数据参数(常量,变量,表达式,只要有确定的值),实参是传递的数据。

2. 实参和形参必须类型相同。若不同时,按赋值规定自动进行类型转换。

3. 在C语言中,参数传递遵循单向值传递,实参只是将自生的值传递给形参,而不是实参本身。形参的值的改变不会影响实参

4. 实参与形参在内存中占据不同的内存空间,尽管可能实参和形参名称是一样的。

案例1:

double fun(double a,double b)
{
    return a + b;
}
    int main()
{
    int x = 12,y = 13;
    int c = (int)fun(x,y);

    // 通过案例:传参时-我们将int类型赋值给double类型,此时程序不报错,因为此时会发生自动类型转换(隐式
转换)
    // 通过案例:返回时-我们将double类型赋值给int类型,此时将满足强制转换需求,需要我们手动转换
}

案例2:

 

/**
* 需求:输入两个整数,要求用一个函数求出其中的最大者,并在主函数输出此数。
*/
#include <stdio.h>
/**
* 求最大值
* @param x,y都是形式参数,形式参数本身没有意义,需要赋值实际参数
*/
int max(int x,int y)
{
    return (x > y ? x : y);
}

int main()
{
    int a,b,c;
    printf("请输入两个整数:\n");

    scanf("%d,%d",&a,&b);
    c = max(a,b);// 这里的a,b就是实际参数

    printf("%d,%d中的最大数是:%d\n",a,b,c);

    return 0;
}

函数的返回值

1.若不需要返回值,函数中可以没有return语句。

2.一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行。

3. 被调用函数返回给主调函数的结果数据(可以是,变量,常量,表达式,只要是有确定值即可。)

4. 返回值类型一般情况下需要和函数中return语句返回数据类型保持一致,如果不一致,以函数定义时指定的返回类型为标准,也就是返回值类型和实际返回值可以存在自动类型转换或者强制类型转换的关系

案例1:

/*
理解:一个函数中可以有多个return语句,但任一时刻只有一个return语句被执行。
*/
#include <stdio.h>
/**
* 求最大值
* @param x,y都是形式参数,形式参数本身没有意义,需要赋值实际参数
*/
int max(int x,int y)
{
    if(x > y)
{
    return x;
}
    return y;
}

int main()
{
    int a,b,c;

    printf("请输入两个整数:\n");

    scanf("%d,%d",&a,&b);

    c = max(a,b);// 这里的a,b就是实际参数

    printf("%d,%d中的最大数是:%d\n",a,b,c);

    return 0;
}

案例2:

/*
理解:返回值和返回值类型不一致时,转换问题
*/
#include <stdio.h>
/**
* 求最大值
* @param x,y都是形式参数,形式参数本身没有意义,需要赋值实际参数
*/
double max(int x,int y)
{
return (x > y ? x : y);
}
int main()
{

    int a,b,c;

    printf("请输入两个整数:\n");

    scanf("%d,%d",&a,&b);

    c = (int)max(a,b);// 这里的a,b就是实际参数

    printf("%d,%d中的最大数是:%d\n",a,b,c);

    return 0;
}

案例3: 

/**
* 理解:返回值和返回值类型不一致时,转换问题。
*/
#include <stdio.h>
/**
* 求最大值
* @param x,y都是形式参数,形式参数本身没有意义,需要赋值实际参数
*/
int max(int x,int y)
{
double z;
z = x > y ? x : y;
return (int)z;// 将double类型转换为int类型,此时会执行强制转换,如果为了增加代码的可读性,我们可以
手动强转
}
int main()
{
int a,b,c;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
c = (int)max(a,b);// 这里的a,b就是实际参数
printf("%d,%d中的最大数是:%d\n",a,b,c);
return 0;
}

函数的调用

调用方式

  1. 函数语句:test(); int result = max(2,4)
  2. 函数表达式:double n = 4+ max(2,4)
  3. 函数参数:printf(”%d”,max(2,4));

在一个函数中调用另一个函数须具备以下条件:

① 被调用的函数必须是已经定义的函数;

② 若使用库函数,应在本文件开头用#include包含;

③ 若使用用户定义的函数,而用户函数又在主调函数的后面,则应在主调函数中对被调用的函数进行声明。声明的作用是把函数名、函数参数的个数和类型等信息通知编译系统,以便在遇到函数时,编译系统能正确识别函数,并检查函数调用的合法性。

函数声明

  1. 函数调用时往往要遵循先定义,后调用,但如果我们对函数的调用操作出现在函数的定义之前,则需要对函数进行声明。
  2. 函数声明的作用:是把函数名,函数参数的个数和返回类型等信息通知给编译系统,以便于在遇到函数时,编译系统能正确识别函数,并检查函数调用的合法性
// 函数调用错误演示
int main()
{
    int c = add(12,13); // 此时会报编译错误,因为函数没有经过声明,所以编译系统无法正确识别函数
    printf("%d\n",c);
}
    int add(int x,int y)
{
    return x + y;
}

 

// 函数调用正确写法
// 函数声明和实现放在一起
int add(int x,int y)
{
    return x + y;
}
    int main()
{
    int c = add(12,13); // 此时会报编译错误,因为函数没有经过声明,所以编译系统无法正确识别函数
    printf("%d\n",c);
}

 

// 函数调用正确写法
// 在函数调用之前,声明函数
int add(int x,int y);
int main()
{
    int c = add(12,13);
    printf("%d\n",c);
}
    int add(int x,int y)
{
    return x + y;
}

声明方式:

  1. 函数首部后加上分号

     2. 函数首部后加上分号,可省略形参名但不能省略参数类型。

 

函数的嵌套调用

  1. 函数不允许嵌套定义,但允许嵌套调用
  2. 嵌套调用:在被调函数内又去主动调用其他函数,这样的函数调用方式称之为嵌套调用

 

案例1:

/**
* 需求:编写一个函数,判断给定的3~100正整数是否是素数,若是返回1,否则返回0
*/

#include <stdio.h>
// 定义一个函数,求素数
int sushu(int n)
{
    int k,i,flag = 1;
    // 素数:只能被1和自身整除的数,需要校验的是2~n-1
    for(i = 2; i < n-1;i++)
    {
        if(n % i == 0)
        {
            flag = 0;
        }
    }
    return flag;
}

// 主函数
int main()
{
    for(int i = 3; i <= 100;i++)
    {
        if(sushu(i)==1)
        {
        printf("%d是素数\n",i);
        }
    }

    printf("\n");

    return 0;
}

 案例2:

/**
* 需求:输入四个整数,找出其中最大的数,用函数嵌套来处理,要求每次只能两个数比较
*/

#include <stdio.h>
// 函数声明
int max_2(int,int);
int max_4(int,int,int,int);
// 主函数
int main()
{
    int a=12,b=44,c=33,d=16,result;
    result = max_4(12,44,33,16);
    printf("%d,%d,%d,%d中的最大数是%d\n",a,b,c,d,result);
    return 0;
}

// 求2个数中的最大数
int max_2(int a,int b)
{
    return a > b ? a : b;
}

// 求4个数中的最大数
int max_4(int a,int b,int c,int d)
{
    int max;// 存储比较的最大数
    max = max_2(a,b);// 第一次比较:a,b中最大数
    max = max_2(max,c);// 第二次比较:a,b,c中最大数
    max = max_2(max,d);// 第三次比较:a,b,c,d中最大数
    return max;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息学奥赛初赛天天练-57-NOIP2018普及组-基础题1-输入输出设备、进制转换、计算机存储单位、 网络地理范围分类、等比数列求和

PDF文档公众号回复关键字:20240806 2019 CSP-J 基础题1 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 以下哪一种设备属于输出设备( ) A 扫描仪 B 键盘 C 鼠标 D 打印机 2 下列四个不同进制的…

PSTNET阅读

ICLR2021 点云序列在空间维度上具有不规则性和无序性&#xff0c;但在时间维度上具有规律性和有序性。 现有的基于网格的卷积不能直接应用于原始点云序列的时空建模。 在时空序列下&#xff0c;基于网格和基于点的卷积对比。 创新点 1.首次尝试在原始点云序列建模中分解空间…

serial靶机教程

靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问&#xff0c;⼤概意思为这是对新的cookie处理程序…

【优秀python案例】基于python爬虫的深圳房价数据分析与可视化实现

现如今&#xff0c;房价问题一直处于风口浪尖&#xff0c;房价的上涨抑或下跌都牵动着整个社会的利益&#xff0c;即便是政府出台各种政策方针也只能是暂时抑制楼市的涨势&#xff0c;对于需要买房的人来说&#xff0c;除了关注这些变化和政策外&#xff0c;还有一个非常头疼的…

工具|阅读PDF时鼠标显示为小手中有向下箭头解决方法

由于工作中&#xff0c;会大量阅读PDF文档&#xff0c;如手册&#xff0c;规格书&#xff0c;各种图纸等&#xff0c;因此好用的PDF工具必不可少。我主要习惯用福昕阅读器&#xff0c;标注比较方便。 所以&#xff0c;本文主要以福昕阅读器为主&#xff0c;当然也适用于其他的阅…

linux文本处理命令:文本搜索工具grep详解

目录 一、概述 二、基本语法 1、语法 2、常用选项 3、获取帮助 三、示例 1. 搜索文件中的字符串 2. 忽略大小写搜索 3. 显示匹配行的行号 4. 反向搜索 5. 递归搜索 6. 使用扩展正则表达式 7. 列出包含匹配项的文件 8. 显示匹配行的上下文 9. 使用正则…

从2013数学建模B题碎纸片拼接问题看递归和迭代思想

目录 1.递归实例说明 2.迭代实例说明 3.迭代思想在碎纸片拼接赛题的运用 1.递归实例说明 斐波那契数列可以使用递归&#xff0c;也可以使用数列的通项公式&#xff0c;但是这个地方建议使用数列的通项公式&#xff0c;因为这个递归的深度过大这个结果很难运行出来&#xff1…

使用WebDAV共享本地文件,轻量易用

特征&#xff1a; 使用 Golang 实现&#xff0c;性能极高。 最终编译成单个二进制文件&#xff0c;不需要 Apache 或类似的环境&#xff0c;依赖性很少。 支持浏览器访问。 可以在同一个端口上启用多个 WebDAV 服务&#xff0c;每个服务具有不同的挂载目录、用户名和密码。 良好…

嵌入式day20

feof&#xff1a; 检测文件是否到达结尾 ferroe&#xff1a; 检测文件是否发生错误 标准IO之文件定位 fseek&#xff08;&#xff09; SEEK_END 指向最后一个字节的后一个&#xff0c;继续加&#xff0c;写文件&#xff0c;会将文件扩大 ftell&#xff08;&#xff09; 获取…

STM32学习笔记1---LED,蜂鸣器

目录 GPIO LED 蜂鸣器 RCC外设 GPIO外设 总概 操作STM32的GPIO 代码 LED闪烁 LED流水灯 蜂鸣器&#xff01; 连接方式 GPIO GPIO输出&#xff1a;向外驱动控制 GPIO输入&#xff1a;读取&#xff0c;捕获&#xff08;信息&#xff09;&#xff08;控制&#xff09…

状压DP,abc359_d - Avoid K Palindrome

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Avoid K Palindrome 二、解题报告 1、思路分析 数据量&#xff1a;N&#xff1a;1000&#xff0c;K&#xff1a;10 提示我们状态压缩 我们发现长度为K的字符串&#xff0c;我们可以用0表示A&#xff…

vue2项目如何引入element组件库以及如何使用element组件库

目录 一、创建项目二、进入项目1、先进入项目&#xff0c;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a1ce9d928fdb4b5d85e6612f458a33db.png)2、路径栏输入cmd&#xff0c;然后回车3、输入code . &#xff0c;然后回车 三、项目启动1、查看启动指令2、启动项目 …

VMwave安装Ubuntu20.04超详细图文教程(附VMwave17.5安装包)

VMwave安装 Ubuntu20.04 超详细图文教程 一、VMwave安装 官网下载 网盘下载 二、Ubuntu下载 三、Ubuntu20.04安装 四、安装VMwave tools 五、更改Ubuntu软件源 注&#xff1a;写教程的时候博主用的是VMware Workstation pro 17(VM17.5) 一、VMwave安装 以下我提供两…

常见中间件漏洞(一、Tomcat合集)

目录 一&#xff0e;Tomcat Tomcat介绍 1.1 CVE-2017-12615 影响范围 环境搭建 漏洞复现 1.2 后台弱口令部署war包 漏洞原理 影响版本 环境搭建 1.3 CVE-2020-1938 漏洞原理 影响版本 环境搭建 漏洞复现 一&#xff0e;Tomcat Tomcat介绍 tomcat是一个开源而且…

clion开发stm32f4系列(一)————移植rt-thread os系统

前言 本次使用的rt-thread的版本为5.0.2基于rt-thread sudio生成的源码进行拷贝和修改工程基于上次创建工程的项目进行修改。本次工程只是用了serial和pin组件,其他后面用到再进行添加 拷贝rt-thread源码库 通过CMakeLists来进行管理 顶级(rt-thread目录) cmake_minimum_req…

Tomcat常见漏洞复现

Tomcat介绍 tomcat是一个开源而且免费的jsp服务器&#xff0c;默认端口:8080&#xff0c;属于轻量级应用服务器。它可以实现JavaWeb程序的装载&#xff0c;是配置JSP(Java Server Page)和JAVA系统必备的一款环境。在历史上也披露出来了很多的漏洞&#xff0c;这里我们讲几个经典…

中国区域创新能力评价报告数据(2001-2023年)

《中国区城创新能力评价报告》是以中国区域创新体系建设为主题的综合性、连续性的年度研究报告。以区域创新体系理论为指导&#xff0c;利用大量的统计数据&#xff0c;综合、客观及动态地给出各省市创新能力的排名与分析。 一、数据介绍 数据名称&#xff1a;中国区域创新能力…

文件夹内鼠标右键没有git bash here?

文件夹内鼠标右键没有git bash here? 如何解决&#xff0c;只需要三步 1、window 搜索git 2、进入git bash 3、输入文件路径&#xff0c;&#xff08;路径为反斜杠/&#xff09; 例如&#xff1a; D:/Desktop/photo

设计模式的概念

设计模式主要分为三类&#xff1a;创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式&#xff1a;简单工厂&#xff0c;工厂模式&#xff0c;抽象工厂&#xff0c;建造者&#xff0c;单例&#xff0c;原型 结构型设计模式&#xff1a;代理模式、享元模式 行…

国密SM4算法进行数据的加密、签名和验签、解密

文章目录 前言一、SM4算法介绍二、生成128位密钥工具类三、SM4Util工具类四、测试示例 前言 本文介绍了SM4算法的基本概念、安全性以及在Java中的应用&#xff0c;包括生成16字节密钥、加密、解密、签名和验签的过程&#xff0c;展示了如何在实际开发中使用SM4算法进行信息安全…