C语言函数的使用
- 函数的概述:将代码进行整合,实现功能的复用。用一个标签——函数名来描述。
函数具有三要素:- 函数名(地址)
- 输入参数
- 返回值
在定义函数是,必须将3要素告知编译器。
指针保存函数:返回值类型(*p)(参数列表)
定义函数
将函数的三要素定义出来即可实现
调用函数
使用函数名即可实现
函数名是地址的思想非常重要,知道函数名的地址就可以对函数进行高效率的操作
输入参数分为实参和形参
调用者通过:函数名(要传递的数据----实参)进行调用
被调用者通过:函数名(接收的数据----形参)被调用
实参通过拷贝(按位逐一复制)传递给形参
值传递形如fun(a,b);
用于情形:
将实参列表的值复制拷贝到函数执行,结果不会改变实参。上层调用者,保护自己空间值不被修改,仅仅使子函数利用上层空间的值进行处理。功能单一。
地址传递形如fun(&a,&b);
用于情形:
将实参列表的地址指针传入函数,使函数能够修改实参。上层调用者让下层子函数修改自己空间值的方式。连续空间的传递,函数与函数之间的调用关系。(比如将传感器采集的信息进行格式转换,得到其他应用能够识别的格式)
连续空间传递的格式:
采用
- 数组
数组名——标签
实参:
int abc【10】;
fun(abc)
形参:void fun(int *p)或者void fun(int p【】) - 结构体
结构体变量
struct abc{int a;int b int c};buf
值传递:
实参:
fun(buf);
形参:
void fun(struct abc a1);
地址传递:
实参:
fun(&buf);
形参:
void fun(struct abc *a1);
结构体应该更多的使用指针方式而不是传值方式。值传递方式对内存消耗过大。
如果空间只读,一般用const修饰指针,提示他人这段空间只读。
比如标准输入函数在库中的声明为:int printf(const char *format,…)
连续空间的传递:
空间传递的需求包括
- 子函数查看空间里的情况。
- 子函数反向修改上层空间里的内容
字符空间与非字符空间结束标志不同。
字符空间的结束符为0X00;
非字符空间没有结束符,通过限制空间大小来结束。
字符空间操作的最小模板 / 框架:
void fun(char *p) // p就是首地址
{
int i = 0;
while(p[i]) // 当p[i] == 0时,结束循环
{
//p【i】的操作
i++;
}
}
字符空间操作举例
求字符串长度函数:
int strlen(const char *p)
{
int i=0;
/*错误处理,判断输入参数是否合法*/
if(p==NULL){//返回错误}
/*内存处理,从头到尾逐一处理*/
while(p【i】){
//p【i】的操作
i++;
}
}
字符串复制拷贝函数: char strcpy(char dest, const char *src);
char* strcpy(char* des,const char* source)
{
char* p=des;
if((des == NULL) && (source == NULL))
{//返回错误}
while((*p++ = *source++)!=NULL);
return des;
}
字符空间的操作,不同的CPU有不同与C标准的方法。
非字符空间操作:
非字符空间规定其字符数量来限制返回。
典型的代码框架为:
void fun(unsigned char *p,int len)
{
int i;
for(i=0;i<len;i++)
{
p【i】=;
a=p【i】;
}
}
但是模板的形参的大小是给定的,在不同的场景要配置不同参数,非常麻烦,C标准库提供了memcpy()函数。
函数返回值的概念:
基本语法:
-
被调用者:
返回类型 函数名称(输入列表)
{
return
} -
调用者:
需要用一个参数来接收函数返回值。——参数=fun();
函数的返回类型不可能是任意类型。
只能返回两种类型:1. 基本数据类型2. 连续空间类型
返回基本数据类型包括int,char,short等标准类型,也可以是结构体
但是结构体传递冗余度大,工程上不建议使用,多用指针来代替。
返回连续空间类型:指针作为指针返回的唯一数据类型
作为函数的设计者,必须保证函数返回的地址所指向的空间是合法的。不是局部变量。
方法有三:
- 用static修饰调用函数的参数,使其保存在静态区,能够正常返回。
- 返回字符串这样保存在只读区的数据。
- 堆区,用malloc函数申请堆区空间。
使用者根据函数的返回类型,定义一个相同的数据类型接收即可。
函数内部实现框架
基本数据类型 fun(void)
{
基本数据类型 ret;
//XXXXXXXXXX
return ret;
}