C语言之函数

VectorCAST 2024 最新版安装避坑全攻略:从Windows到Linux,手把手搞定许可证服务器 本文详细解析VectorCAST 2024最新版在Windows和Linux系统下的安装与许可证服务器配置全流程,涵盖环境预检、许可证服务深度配置、客户端连接优化及高频故障排查。特别针对FlexLM许可证服务依赖机制优化后的跨平台部署难点,提供20个关键配置节点的预防性解决方案,助力嵌入式软件测试人员高效完成部署。 阅读详情

1.前导程序

View Code 

2.函数概述

  • 函数是用于完成特定任务的代码的自包含单元。一般而言函数可同时具有,执行动作和返回值两个操作。
  • 如果把函数写在了另一个单独的文件中,则在那个文件中必须加入#define和#include指令。
  • 一个程序分析
复制代码
 1 //打印一个信头
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define NAME  "GIGATHINK,INC."
 5 #define ADDRESS "101 Megabuck Plaza"
 6 #define PLACE "Megapolis,CA  94904"
 7 #define WIDTH  40
 8 #define SPACE ' '
 9 void show_n_char(char ch,int num);//函数定义
10 int main(void)
11 {
12     int spaces;
13     show_n_char('*',WIDTH);//使用常量作为参数
14     putchar('\n');
15     show_n_char(SPACE,12);
16     printf("%s\n",NAME);
17     spaces=(WIDTH-strlen(ADDRESS))/2;//让程序计算
18                                     //需要跳过多个空格
19 
20     show_n_char(SPACE,spaces);      //用一个变量作为参数
21     printf("%s\n",ADDRESS);
22     show_n_char(SPACE,(WIDTH-strlen(PLACE))/2);//用一个表达式作为参数
23     
24     printf("%s\n",PLACE);
25     show_n_char('*',WIDTH);
26     putchar('\n');
27 
28     return 0;
29 }
30 
31 
32 void show_n_char(char ch,int num)
33 {
34     int count;
35 
36 
37     for(count=1;count<=num;count++)
38         putchar(ch);
39 }
复制代码

(1)void show_n_char (char ch,int num)这行代码通知编译器shpw_n_char()函数使用名为ch和num的两个参数,并且这两个参数的类型分别为char和int类型,变量ch和num被称为形式参量(数),他们是局部变量时函数所私有的,这意味着在其他函数中,可以使用相同的变量名,每当调用函数时,这些变量就会被赋值。
(2)ANSI C形式要求在每个变量前声明类型。如void dibs(int x,y,z)这样的函数头是不正确的,可以写成void dibs(x,y,z) int x,y,z;这样的形式。

(3)在原型中使用变量名并没有实际的创建变量,这些变量名只是虚设的名字,不必和函数定义中的使用的变量名相匹配。

(4)show_n_char(SPACE,12)。实际参数是空格和12,这两个数值被赋给show_n_char()中相应的形式参数:变量ch和num;实际参数可以是常量变量或者是一个更复杂的表达式,但是无论何种形式的实际参量,计算时都要首先计算其值,然后将该值复制给被调用函数中相应的形式参数。不管在被调用函数中对复制数值进行什么操作,调用函数中的原数值不会受到任何影响。

(5)黑盒子观点:黑盒子内的一切操作对调用函数来说是不可见的。

(6)函数应该进行类型声明,其类型应该和返回值类型相同。函数声明要在函数使用之前,它只是将函数类型告诉编译器,而函数定义部分则是函数的实际实现代码。

(7)return :给函数返回一个值或者是终止执行函数。

return语句
复制代码
 1 //不正确的使用函数
 2 //程序仍然可以编译通过
 3 #include<stdio.h>
 4 int imax();
 5 int main(void)
 6 {
 7     printf("The maximum of %d and %d is %d.\n",3,5,imax(3));//漏掉了一个参数,第二个则去堆栈中的其它值
 8     printf("The maximum of %d and %d is %d.\n",3,5,imax(3.0,5.0));//使用浮点参数而不是整型参数
 9     return 0;
10 }
11 
12 int imax(n,m)
13 int n,m;//请注意变量声明的位置
14 {
15 
16     int max;
17     if(n>m)
18         max=n;
19     else
20         max=m;
21     return max;
22 }
23 
24 /*
25 #include<stdio.h>
26 int imax(int,int);//a
27 int main(void)
28 {
29     printf("The maximum of %d and %d is %d.\n",3,5,imax(3,5));//b
30     printf("The maximum of %d and %d is %d.\n",3,5,imax(3.0,5.0));//调用时被转换成了调用imax(3,5)
31     return 0;
32 }
33 
34 int imax(int n,int m)//c
35 {
36 
37     int max;
38 
39     if(n>m)
40         max=n;
41     else
42         max=m;
43     return max;
44 }
45 */
复制代码

3.递归

复制代码
 1 //递归举例
 2 #include<stdio.h>
 3 void up_and_down(int);
 4 int main(void)
 5 {
 6     up_and_down(1);
 7     return 0;
 8 }
 9 
10 void up_and_down(int n)
11 {
12     printf("Level %d:n location %p\n",n,&n);//1
13     if(n<4)
14         up_and_down(n+1);
15     printf("Level %d:n location %p\n",n,&n);//2
16 }
复制代码

  • 一个函数调用其本身,这种调用过程被称为递归。
  • 递归的基本原理
  1. 每一级的函数调用都有自己的变量。
  2. 每一次函数调用都会有一次返回。当程序执行到某一级递归的结尾处时它会转移到前第一级递归继续执行,程序不能直接返回main()中的初始调用部分,而是通过递归的每一级逐步返回。
  3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。
  4. 位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。
  5. 虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。
  6. 递归函数中必须包含可以终止递归调用的语句。
  • 递归和反向计算(#以二进制形式输出整数)
View Code 
  • 尾递归:把递归调用语句放在函数结尾即恰在return语句之前。
使用循环和递归计算阶乘

 4.地址运算符:&

  • 一个变量的地址可以被看做是该变量在内存中的位置。
查看变量的存储地址

5.指针简介

(1)指针是一个其数值为地址的变量。指针变量的数值表示的是地址。

(2)ptr=&pooh;//把pooh的地址赋给ptr。ptr=&bah;//令ptr指向bah而不是pooh。

(3)指针是一种新的数据类型,而不是整数类型。

1 nurse=22;
2 int*ptr;//指针声明
3 ptr=&nurse;//指向nurse的指针
4 val=*ptr;将ptr指向的值赋给val,即val=22;

(4)通常情况下,可以把关于变量的两类信息传递给参数,分别是参数的值和参数的地址。
(5)float*pi;//pi是一个指针,而且*pi是float类型的。

复制代码
 1 //交换函数
 2 /*
 3 #include<stdio.h>
 4 void interchange(int u,int v);
 5 int main(void)
 6 {
 7     int x=5,y=10;
 8     printf("Originally x=%d and y=%d.\n",x,y);
 9     interchange(x,y);
10     printf("Now x=%d and y=%d.\n",x,y);
11     return 0;
12 }
13 
14 void interchange(int u,int v)
15 {
16     int temp;
17     temp=u;
18     u=v;
19     v=temp;
20 }
21 //数据交换失败
22 */
23 //交换函数@使用指针
24 #include<stdio.h>
25 void interchange(int *u,int* v);//1
26 int main(void)
27 {
28     int x=5,y=10;
29     printf("Originally x=%d and y=%d.\n",x,y);
30     interchange(&x,&y);//参数是两个地址2
31     printf("Now x=%d and y=%d.\n",x,y);
32     return 0;
33 }
34 
35 void interchange(int *u,int *v)//3
36 {
37     int temp;
38     temp=*u;
39     *u=*v;
40     *v=temp;
41 }
复制代码
关于Linux系统VectorCast单元测试和集成测试详解/linux系统更换镜像源/ 比较全面的linux系统VectorCast测试环境搭建方案,以及部分问题解决 阅读详情

相关推荐

OCTA-500:用于光学相干断层扫描血管造影研究的视网膜数据集|文献速递-基于生成模型的数据增强与疾病监测应用

数据集提供了丰富的图像和注释,包括两种模态(OCT/OCTA体积)、六种投影类型、四种文本标签(年龄/性别/眼别/疾病)以及七种分割标签(大血管/毛细血管/动脉/静脉/2D FAZ/3D FAZ/视网膜层)。我们介绍了新的 OCTA-500 数据集,该数据集包含来自 500 名受试者的 OCTA 成像,并提供了丰富的图像和标注集。(C) OCTA-500 切片的人工标注示例。图 4. OCTA-500 数据集中文本标签的统计直方图:(a) 性别,(b) 眼别,(c) 年龄,(d) 疾病。

weixin_38594676的博客 1434

VectorCAST安装指南

在这个例子中,许可证服务器的主机名是cn01439nb,MAC地址是98FA9BD88094,lmgrd端口为27000,如不配置,默认为27000。如下图,27000为默认端口号。如果已知license服务器的信息,比如xxx@ooo,则可以直接选择第二步,然后输入xxx@ooo,这样工具会自动创建VECTOR_LICENSE_FILE的环境变量。参照检查许可证文件章节描述,固定lmgrd和vector申请的端口,并将lmgrd.exe和vector.exe及对应的端口号添加到服务器防火墙的入站规则中。

弈星的博客 6238

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 442

VectorCAST:嵌入式代码自动化测试解决方案(Lnixu RSP包的使用)

1.2.1 QEMU_DEBUG_SCRIPT_PATH在工具的启动脚本中配置,指向存放simulator_qemu_debug.sh的存放路径。如果包含多个路径,如果包含多个路径,只有最后一个路径会生效。9.5.2 在/etc/ld.so.conf.d目录下,新建一个.conf文件,在文件中加入库所在的目录,然后sudo ldconfig更新ld配置。4.1.1.2 --cmd-verb=XXX中的XXX为项目的链接命令执行器,一般和编译命令的执行器一样。

弈星的博客 2071

基于Android Studio的校园智能点餐系统开发实战(附完整源码与部署指南)

本文详细介绍了基于Android Studio开发校园智能点餐系统的完整流程,包括需求分析、环境搭建、数据库设计、客户端与后台功能实现。系统采用SSM框架和MySQL数据库,解决了校园食堂高峰期排队问题,提供高效的点餐体验。附完整源码与部署指南,助力开发者快速构建类似应用。

weixin_29015801的博客 558

Doris副本修复实战:从状态机到手动修复的完整指南

在分布式数据库系统中,多副本机制是实现高可用与数据一致性的核心技术。其原理是通过在不同节点存储数据的多个拷贝,确保部分节点故障时服务仍可继续。这项技术的核心价值在于保障数据可靠性,并支撑在线分析处理(OLAP)等对数据一致性要求高的应用场景。当副本出现损坏、丢失或版本不一致时,系统通常依赖自动修复机制,但在元数据损坏、多副本同时故障等复杂场景下,自动修复可能失效,需要深入理解副本状态机并借助手动工具介入。本文将聚焦Doris数据库,解析Tablet副本状态流转(如BAD、VERSION_ERROR),并详细

weixin_32288959的博客 457

VectorCAST软件安装

在这一步选择第四项:Skip this step - I will set up Licensing later. 跳过这一步,先不进行 License 配置,之后在此界面点击 Next,进入下一步。在 Windows 平台,安装文件是一个压缩文件(zip 文件),请将其解压缩,解压缩后,找到 setup.exe, 双击运行,打开软件安装界面,之后在此界面点击 Next,进入下一步。选择安装类型,选择 Complete(完整),之后在此界面点击 Next,进入下一步。在弹出的提示框中点击确定。

嵌入式之斋 1961

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

C语言函数

函数的概念 每个C程序都至少有一个函数,即主函数main(),如果程序的任务比较简单,全部的代码都写在main()函数中,但是,在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿,结构复杂,代码重复。 我们可以根据程序的逻辑和任务的分工把代码划分到不同的自定义函数中,main()更关心业务逻辑和处理...

C语言技术网-码农有道 5万+

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 109

智驾车载以太网(18)-switch之报文转发和vlan处理流程

本文详细解析了交换机中报文处理和转发流程:1)通过目标MAC查找转发端口,源MAC创建ARL条目;2)VLAN标签处理包括tagged/untagged帧判断、默认VID标记等5种处理方式;3)完整转发流程包含CRC校验、IQ封装、VLAN和ARL表查询、端口向量计算及优先级队列发送。文中还涉及TCAM修改VLAN、802.1q多种模式处理等细节,省略了流量控制等次要流程。该过程实现了基于MAC和VLAN的高效二层交换。

mitugaoyang1993的博客 41

【C语言函数基础】

文章目录1.函数2.C语言函数分类2.1 库函数2.1.1 库函数的分类2.1.1 库函数的学习2.2 自定义函数3.函数的参数3.1 实际参数3.2 形式参数4.函数的调用4.1 传值调用4.2 传址调用5.函数的声明和定义 1.函数 百度百科对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,有一个或者多个语句块组成,它负责完成某项特定的任务,而且相比于其他的代码,具备相对的独立性。 一般来说会有输入参数和返回值,提供对过程的封装和细节的隐藏,这些代码通常被集成为软件库。 2.

qq_43727529的博客 4972

YOLOv8改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 58

什么是c语言函数,C语言中的函数是什么意思

C语言中的函数是什么意思简单来说函数就是c语言的模块,一块块的,有较强的独立性,但是可以相互调用。这是c和c++区分的地方,c++面向对象,对象独立完成功能,无需调用。一个c程序就可以是一个函数,里面再包含n个函数。【延展】C语言中函数和函数体的区别是什么?第一、 简单来说函数就是c语言的模块,一块块的,有较强的独立性,但是可以相互调用。一个c程序就可以是一个函数,里面再包含n个函数,有固定输入和...

weixin_39986543的博客 6503

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言——函数

C语言中的函数又常常被称为子程序,是用来完成某项特定的工作的一段代码。就像我们生活中的模块化建造技术,类比模块化建房子的过程:整个程序好比最终要建成的房子,而函数所代表的就是每部分模块(如第一层,第二层或者屋顶···),将这些模块灵活的拼接,就搭建成了最后的房子。从函数的定义角度:我们可以把函数分为库函数和自定义函数是由用户根据需要自行编写的函数,创建格式如下:ret_typename形式参数函数体(用来描述函数执行过程的部分)创建例子:int决定了z的返回类型是整形int。

tan_run的博客 2087

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C语言main函数的写法

main函数是C程序的入口函数,即程序的执行是从main函数开始,对其他函数的调动也是直接或间接地在main函数中被调用。那么main函数又是被谁调用呢?答案是操作系统。C语言发展至今,对main函数有多种不同的写法,下面就来探究一下各种不同的写法。注:测试环境为Ubuntu 17.10,GCC版本为7.2.0。 NO.1 main(){}例: #include mai

αlphαβet 5万+

Camera2Demo

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

【C语言】函数

文章摘要: 本文系统讲解了C语言函数的核心知识,包括函数的概念、组成要素和使用方法。重点介绍了库函数(如sqrt)和自定义函数的定义与调用,强调形参实参的区别及return语句的使用规范。通过加法函数等代码示例,展示了函数在代码复用和模块化设计中的优势。文章还提及数组作为函数参数的应用场景,帮助读者全面掌握C语言函数编程技巧。

2301_78257800的博客 1735

c语言——函数

库函数很重要但在c语言中更重要的是自定义函数,有了自定义函数我们才能写出不一样的代码,让我们更具有创造性。我们可以把函数想象成小型的⼀个加工厂,工厂得输入原材料,经过工厂加工才能生产出产品,那函数也是一样的,函数⼀般会输入一些值,这些值也就是参数(可以是0个,也可以是多个),经过函数内的计算,得出结果。在以上某年某月有多少天的程序中就实现了函数的定义与调用如果将自定义函数放在main函数后会发生什么呢?这时我们就会看到以下警告出现这种情况的原因是。

mljy.博客 1912

C语言:函数

仅仅是利用编译器提供给我们的头文件中的函数是远远不够我们利用来编写更高效的C程序的。人的头脑是有无限潜力的,我们可以想出很多可以由我们来定义的函数,编译器允许我们定义自定义函数。这样,就可以使我们的C程序的效率提高好几个档次。形式如下:ret_type fun_name(形式参数)代码;//ret_type是函数返回类型//fun_name是函数名//括号中放的是形式参数//{}括起来的是函数体我们可以把函数想象成小型的一个加工厂。工厂得输入原材料,经过工厂加工才能生产出产品。

2302_80177865的博客 1736

C语言的函数

C语言~

2403_88316985的博客 1857

函数c语言_C语言函数习题及答案

点击蓝字关注我们FOLLOW US1.这下面程序的正确运行结果是(C)。void fun(int s[],int n1,int n2){ int i,j,t; i=n1; j=n2; while (i { t=s[i];s[i]=s[j]; s[j]=t; i++;j--; }}int main(){int a[10]={1,...

weixin_42355387的博客 7441

C语言之函数总结

前言 函数是C语言的基本组成单元,充分发挥函数功能,可以使程序容易编写、阅读、调试和修改。本文是对函数的总结。 一、什么是函数?为什么要用函数? 1、函数是完成特定任务的独立程序代码单元。 2、使用函数的原因: (1)使用函数可以省去编写重复代码的苦差事 (2)及时程序只完成某项任务一次,也值得使用函数。因为函数让程序更加模块化,从而增加程序代码的可读性,更方便后期修改、完善。 二、函数的分类 库函数和自定义函数 1.库函数 (1)如printf()、strlen()......,由C语

Poem_coder的博客 3791
上一篇: C语言之输入和输出
下一篇: C语言之常见问题
Shicuf
博客等级 码龄16年 11粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值