【C功能体】C语言的函数语法和特性

c语言中的argp_parse函数 在C语言中,argp_parse函数是argp库(命令行参数解析库)提供的函数之一,用于解析命令行参数并进行相应的处理。这就是一个使用argp_parse函数解析命令行参数的简单示例。在实际使用时,可以根据需求进一步定制选项和解析规则。函数返回值为0表示成功解析参数,非零值表示解析失败。 阅读详情

在C语言中,函数是一组执行一个任务的诸多语句的组合。就像数学中的函数一样,输入自变量(参数),就可以得到因变量(输出)。


Table of Contents

声明与定义函数

函数调用

main函数的参数

可变参数函数


 

函数长啥样?


声明与定义函数

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

 

声明函数:

  1. 函数声明格式:返回类型 函数名(参数列表);   例如:int max(int a, int b);
  2. 参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:int max(int, int);
  3. 函数声明一般在源文件的最顶部(头文件和宏定义之后、main函数之前);
  4. 当出现在一个源文件中定义函数而需要在另一个函数中调用函数时,函数申明是必需的。例如,在头文件中声明函数,在具体文件中定义函数。

 

定义函数:

  1. 函数由一个函数头和一个函数主体组成。其中,函数头的格式为“返回类型 函数名(参数列表)”,函数主体由“{}”扩起来的部分。
  2. 返回类型:一个函数可以返回一个值(需要指明类型,如int,double),也可以不返回(即为void)。
  3. 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。函数的命名需参照编程范式中的一些原则。
  4. 参数:参数就像是占位符。参数列表包括函数参数的类型、顺序、数量。也可以不含有参数。
  5. 函数主体:函数主体包含一组定义函数执行任务的语句。

申明、定义函数:

申明、定义函数
#include <stdio.h>

int max(int, int); //函数声明,只需要注明类型
int min(int a, int b); //函数声明,详细注明类型和变量名

//函数定义
int min(int a, int b)
{
	//实现
	return b;
}

int main()
{
	//调用
	max(1, 2);
	min(1, 2);
	return 0;
}

//已经申明过了的函数,可以在本文件其他函数体以外的任何地方定义。
int max(int a, int b)
{
	//实现
	return a;
}

函数调用

理解函数调用:

  1. C语言中的一个函数,就如同数学中的一个函数一样(映射关系:一个输入对应一个输出);
  2. 把一个大功能的实现分割成许多个小功能组件(即一个个地函数),再一一调用这些组件(函数);
  3. 以做饭吃饭为例,以往饿了的话,需要自己买菜、煮饭、炒菜,然后才能吃到饭;而今你可以直接调用买菜做法的功能,直接就能够吃到饭了。

 函数调用示意图:

函数调用中的参数问题:

  1. 传值调用:又叫副本机制,把调用函数时的传入的值称为实参,把执行该函数时传入的参数值称为形参。副本机制的含义是:复制实参的值给形参,形参无论怎样变化,对实参都毫无影响。
  2. 引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

 

函数调用中的内存情况:

main函数中的各种变量、常量存放情况:

main函数中malloc、realloc的内存:

 子函数1在栈区开辟的内存,子函数1和2均可以使用:

子函数2在全局区开辟的内存,子函数1和main函数均可以使用:


main函数的参数

一般来说,C语言的main函数的写法应该是:

#include <stdio.h>

int main(int args, char* argv[])
{
    //....
    return 0;
}

其中,args参数表示传递的参数个数,argv参数表示一个指针数组,存储每个args个参数的具体内容。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

int main(int args, char *argv[]) //args是给main函数传参的个数,argv是指具体的参数是啥
{
	printf("args=%d\n", args);
	for (int i = 0; i < args; i++)
	{
		printf("%s\n", argv[i]);
	}
	system("pause");
	return 0;
}
/*直接运行的结果:
args=1 //参数的个数为1个
F:\ProgramDesign\VisualStudio2017\KyleC\Debug\KyleC.exe  //输出程序的绝对路径
*/


可变参数函数

什么是可变参函数?

  • 一般情况下,一个参数,只会接受参数列表个数的参数个数。例如,函数“int max(int a, int b) {...}”,只能接受两个int型的参数。
  • 那么想要实现在上述例子中,随机输入多个参数,应该怎么办呢?

 

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。

实例

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>  //有很多宏,我们可以处理可变参数的函数
#include<string.h> 

double add(int num, ...)  //...代表可变的参数,至少定义一个num(参数有多少个呢?) 
{
	double last = 0.0;
	va_list argp; //创建一个char类型的指针,存储地址;转到定义是:typedef char *  va_list; 
	va_start(argp, num);  //从这里开始读取参数,读取num个参数,并把读取到的东西的地址放在argp;
	int i;
	for (i = 0; i<num; i++)
	{
		double temp = va_arg(argp, double); //读取参数,并以double类型来读取; 
		printf("\n%f", temp);  //输出每次读取的东西; 
		last += temp;
	}
	va_end(argp); //结束读取;
	return last;
}

void go(int num, ...)
{
	va_list argp; //定义指针,用于存储地址;
	va_start(argp, num); //num代表是有num个参数;
	int i;
	for (i = 0; i<num; i++)
	{
		char str[50];  //保存读取的字符串;
		strcpy(str, va_arg(argp, char*));//按照字符串的参数读取一个参数,并且以char* 的类型去读,复制到str;
		printf("%s", str);
		system(str);
	}
	va_end(argp);  //结束调用;
}

int main()
{
	/* int x=12;
	double result=0;
	result=add(x,1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9,9.10,10.11,1000.0,100000.0);  //刚开始的第一个数:x表示的数要与后面的参数的个数相同;
	printf("\n%f",result);*/

	putchar('\n');
	go(6, "start notepad", "tasklist", "start mspaint", "start write", "title kyle", "color a");
	//同时打开所有的东东; 
}

 

C语言的语法糖 在编程语言中,语法糖(Syntactic Sugar)是指那些在语言的语法上被设计得更加简洁、易读的特性,目的是为了让程序员更方便地表达他们的思想,而不是增加语言的功能性。换句话说,语法糖并不增加语言的表达能力,而只是使某些操作的书写更加直观。 阅读详情

相关推荐

【C语言-7】10分钟学会C语言基础语法

系列文章目录 C语言系列课1:什么是计算机语言? C语言系列课2:C语言的发明及发展 C语言系列课3:C语言是不是过时了? C语言系列课4:C语言程序开发步骤 文章目录前言1. 主函数2. 什么是函数?3. 写一个自己的函数4. 主函数是整个C语言程序的入口5. 要调用函数,必须先知道函数。6. 什么是变量?7. 什么是字面常量?8. printf函数printf函数更多用法9. #include命令 前言 #include <stdio.h> int main() { printf

小杰码匠 1686

一步步了解Argp

一步步了解Argp:《Step-by-Step into Argp》译

大草的博客 4225

libargp:可移植的库,提供Gnulib的“ argp”模块的命令行解析功能(GNU可移植性库)

libargp libargp是提供所述的argp模块的命令行解析功能的便携式库(Gnulib)。 源代码直接utilitises的Gnulib,其通常与所述同步的的的(glibc的)。 建造 要构建该库,只需从项目的根目录运行./build即可。 这将在output子目录中产生所有输出。 正在安装 要安装该库,请先对其进行构建,然后以超级用户身份从项目的根目录运行./install 。 这会将库安装在默认前缀目录/usr/local 。 可以通过在安装之前设置INSTALL_PREFIX环境变量来指定自定义前缀目录。 用法 该API记录在GNU C库的中。 更新源代码 Gnulib模块的源代码的导入版本包含在项目目录中。 如果要将导入的版本更新为Gnulib的最新源,则首先需要获取的副本。 该软件包包含GNU代码的源代码(包括相关模块)以及程序 ,该程序可以将此类GNU代码导入到单

argp包处理命令行参数

argp是一个在 GNU C Library (glibc) 中的库,用于解析命令行参数。它为 UNIX 风格的命令行参数提供了一种简洁和统一的方法。以下是一个简单的使用argp解析命令行参数的例子:先确保您的系统中有argp。它通常随glibc一起分发,所以大多数 Linux 系统上应该都有。下面我们来看一个实例。

青衫客36的博客 1437

Stm32L0 STM32CUBE中UART和使用LPUART1以及串口不进中断问题解决

/* 开启串口1中断 */ LL_USART_EnableIT_RXNE(LPUART1); /* 开启串口2中断 */ LL_USART_EnableIT_RXNE(USART2);

シ❤゛甜虾的个人博客 7686

SAP采购订单中项目类别B(限制)的控制逻辑

在笔者所在企业中,框架类采购订单中项目类别需要选择B(限制)。今天笔者从比较全面的角度分析了一下这个项目类别B到底可以决定些什么?控制到什么?先从后台SPRO中打开相应的配置菜单。 打开项目类别B之后,可以看到一些配置信息,这里有一点与其它配置不同的地方,即无法新增项目,也无法修改现有项目。这个疑惑今后再去解决吧。当前只研究项目类别B的控制逻辑。 下面就参考上图中的配置分段来分析和测试其控制逻辑, 1、如项目类别配置图,所需材料值为不允许;经测试,如下图在采购订单创建时,不能输入物料编号条目。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6032

《Linux程序设计(第四版)》---第一章:入门

贯穿本书的一个大型示例项目:一个简单的用于记录音乐CD详细资料的数据库应用程序 unix是一种多用户多任务的操作系统 unix unix操作系统鼓励一种特定的编程风格,以下是典型的unix程序和系统所具有的特点 简单 集中 当用户出现新的需求时,把小工具组合起来已完成更加复杂的任务,而不是将所有功能都放在一个大程序中 可重用组件 将应用程序的核心实现为库,具有简单而灵活的编程接口、文档完备的...

我是一只小嵩鼠 1295

宝塔部署若依前端出现502解决方法

若依系统是一个基于Java语言的开源项目,旨在帮助开发者减少开发时间,特别适用于需要快速开发出一套具有用户管理、菜单管理、权限管理、定时任务、日志管理等功能的简单系统。系统分为前后端分离、分布式等架构前后端分离部署教程然而通过宝塔来部署若依系统会遇见一些问题,特此在这里记录一下。

m0_74823683的博客 776

Linux下头文件

今天在敲一个程序时用到了VC下的一个conio.h头文件,发现在Linux里面编译不了,找了点关于这个头文件的资料: conio.h不是C标准库中的头文件,在C standard library,ISO C 和POSIX标准中均没有定义。 conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通

FOLORO的博客 1889

保姆级教程:用Seurat 5.0.1搞定单细胞测序数据从质控到细胞注释的全流程

本文提供了一份详细的Seurat 5.0.1单细胞测序数据分析教程,涵盖从数据质控到细胞注释的全流程。通过R代码示例和可视化分析,帮助用户掌握单细胞RNA测序数据处理的核心技术,包括数据标准化、降维聚类和细胞类型注释,适用于生物信息学研究和临床数据分析。

weixin_29067143的博客 196

S4 Hana SD -信贷管理 - 03

自动信用控制将针对同一信用控制范围的不同的客户风险类别和信贷组执行不同的信用控制政策。对于ECC系统而言,无需单独设置检查规则,可在自动信贷控制进行设置即可,如图1-5-2。在S4 HANA版本中,自动信贷控制和检查规则是分离的。S4系统需要在定义自动信贷控制的时候,给字段“SAP信用管理”打钩,激活检查规则,然后需要单独在检查规则页签设置检查规则。接下来,我们分别介绍ECC和S4 HANA系统中两种不同配置方式.6.2SPRO。

weixin_46525734的博客 2888

C++和C语言常用语法对比

这里写自定义目录标题C语言与C++的区别:1.头文件2. 结构体struct3.动态数组的创建与删除4.函数顺序问题5.类(class) 前言: C语言与C++的区别: 1,全新的程序程序思维,C语言是面向过程的,而C++是面向对象的。 2,C语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;而C++对于大多数的函数都是有集成的很紧密,特别是C语言中没有的C++中的API是对Window系统的大多数API有机的组合,是一个集体。但你也可能单独调用API。 3,特别是C++中的图形处理,它

haoweixl的博客 6632

汽车标定技术(七)--英飞凌TC3xx_Overlay实现页切换

今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。

认真搞搞汽车MCU 4015

C语言基础语法汇总

C语言基础语法汇总

qq_46332212的博客 4181

华为od 面试八股文_JAVA语言_01_含答案

华为od 面试八股文_JAVA语言_01_含答案

MISAYAONE的博客 4309

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【C语言】函数 & 数组

本文介绍了C语言中函数和数组的基本概念与使用方法。函数部分阐述了函数的由来、好处、定义格式及调用实例,强调了函数在模块化编程、代码复用和程序可读性方面的重要性。数组部分讲解了数组的定义、初始化、访问方式及注意事项,通过实例演示了如何利用数组存储和访问一组相同类型的数据。全文以通俗易懂的方式帮助读者掌握C语言中这两个核心概念的应用技巧,适合初学者快速理解函数和数组的基本使用方法。

"謓泽"正在路上朝着"攻城狮"方向"前进四"! 4880

visio安装包

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

C语言与C++语言的区别:语法、特性和应用领域的比较

熟练掌握C语言和C++语言的差异,有助于开发者更好地选择和应用这两种语言。C语言是一种过程化编程语言,而C++语言是在C语言基础上发展起来的一种面向对象编程语言。它继承了C语言的语法,并增加了类、对象、继承、多态等面向对象的特性。C++语言的语法相对复杂,但也更加灵活和强大。C++语言继承了C语言的特性,并引入了面向对象编程的特性。面向对象的特性使得C++语言更适合开发复杂的软件系统,并提供更好的代码组织和维护能力。C语言和C++语言是两种广泛使用的编程语言,它们在许多方面有相似之处,但也存在明显的区别。

LiXinLong_LXL_13的博客 1271

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言函数详解

自定义函数给程序员写代码提供了更多的创造性。比如:我们要写一个函数判断一年是否是闰年。//函数定义return 1;//函数调用printf("闰年\n");elseprintf("非闰年\n");return 0;那如果我们将函数的定义放在函数的调用后边int main()int y = 0;//函数调用printf("闰年\n");elseprintf("非闰年\n");return 0;实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x 和 y 只是形式上存在的,不会向内存

2302_81312180的博客 1249

C语言语法总结

1.C语言的数据类型 基本类型    a.整型:       整型 int   Visual c++6.0 中占4 个字节; Turbo c 2.0占 2个字节 取值:-2147483648 -2147483647       短整型 short int 2个字节 取值:

Juyon 1万+

C语言不同版本特性差异

C语言自1972年诞生以来,经历了多个标准版本。主要的版本差异如下:K&R C(1978):由Brian Kernighan和Dennis Ritchie在《The C Programming Language》一书中描述,被认为是C语言的第一个标准。函数定义中参数列表和类型分开声明,例如:int foo(a, b) int a;int b;{ … }不支持函数原型,函数声明中没有参数类型。没有void类型,使用int表示无返回值。预处理功能较弱。

若有博文对您有帮助,欢迎点赞关注,收藏评论。 1530

Objective-C语言的语法

在Objective-C中,方法是类的核心组成部分。方法的定义使用表示实例方法,表示类方法。以下是一个简单的实例方法的定义:@end");@end```在Objective-C中,类是对象的蓝图。类由@interface和两个部分组成。如下所示:@end@end```Objective-C是一种强大的编程语言,通过结合C语言的高效性和Smalltalk的面向对象特性,成为苹果生态系统中的核心语言。

2401_90032315的博客 1701

C语言的语法

函数是实现特定功能的代码块,可以通过函数名进行调用。c// 函数体例如,定义一个计算两个整数和的函数:```c// 在主函数中调用printf("和是: %d\n", sum);return 0;// p指向a的地址printf("a的值: %d\n", *p);// 通过指针访问a的值。

2401_90032043的博客 1491

C语言函数

语法:形参用指针( int *p ),调用时传地址( changeValue(&num) )比如计算两数之和的函数,就像一个“加法工具”,给它两个数(输入),它返回和(输出)。- 如 int (返回整数)、 float (返回小数)、 void (无返回值)- 字符串操作: strlen() (求长度)、 strcpy() (复制字符串)- 内存操作: malloc() (动态分配内存)、 free() (释放内存)- 实参是变量的地址(如 &num ),形参是指针(如 int *p )

d050110的博客 1736
上一篇: 【C功能体】三种流程控制结构
下一篇: 【C功能体】关键字:typedef、const与define
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值