函数

C语言程序主要是函数之间的相互调用组成的,面向过程是一种以过程为中心的编程思想,首先将复杂的问题分解成一个个容易解决的问题,分解后的问题可以按照步骤一步步完成,函数是面向过程在C语言中的体现,解决问题的每个步骤可以用函数来实现
函数一般来说需要声明和定义,声明的意义在于告诉编译器程序单元的存在,而不知道是如何存在的,定义则明确指示程序单元是如何存在的,C语言中通过extern进行程序单元的声明,在C语言中变量的定义必然伴随着内存的分配,变量的声明仅仅告诉编译器有这么个变量存在

函数的声明和定义
例子:
a.c
在这里插入图片描述
b.c
在这里插入图片描述
结果:
在函数‘main’中, 错误: ‘sizeof’不能用于不完全的类型‘struct Test’, 这个是因为我们struct Test结构体内存的大小我们是不知道的,结构体内存的大小取决结构体的定义,我们的a.c文件中只有结构体的声明,当我们的a.c文件先编译时我们的编译器根本就不知道struct Test结构体内存的大小,所以会报错,验证了定义才分配内存,而声明时不会的,而且声明的类型要和定义一致

函数的参数:
函数参数在本质上与局部变量相同在栈上分配空间,函数参数的初始值时函数调用时的实参值,函数的实参求值顺序依赖于编译器的实现
例子:
在这里插入图片描述
结果:
sice@sice:~$ ./a.out
2, 1
3
可以看出实参的求值顺序并不是跟它在调用时的实参顺序有关

函数参数的入栈次序:
入栈次序就涉及到调用约定,调用约定时预定义的可理解为调用协议,调用约定通常用于库调用和库开发的时候,
从右向左依次入栈:__stdcall,__cdecl(C默认),__thiscall
从左向右依次入栈:__pascal,__fastcall
比如我们的主程序在调用库函数时,所以需要在主程序中声明调用约定和库函数是一致的,目前大多数的库是用C语言来完成的,所以我们平时的大多数库函数调用时不会有问题的

函数的可变参数:
C语言中可以定义参数可变的函数,参数可变函数的实现依赖于stdarg.h头文件
va_list 参数集合
va_arg 取具体参数值
va_start 标识参数访问的开始
va_end 标识参数访问的结束
可变参数必须从头到尾按照顺序逐个访问,至少要存在一个确定的命名参数,它无法确定实际存在的参数的数量,无法确定参数的实际类型,如果va_arg指定了错误的类型,后果是不可预测的
例子:
求几个数的平均值
在这里插入图片描述
以上代码来自狄泰软件学院

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值