嵌入式开发学习历程(五)——C语言函数

C语言函数的使用

  1. 函数的概述:将代码进行整合,实现功能的复用。用一个标签——函数名来描述。
    函数具有三要素:
    1. 函数名(地址)
    2. 输入参数
    3. 返回值
      在定义函数是,必须将3要素告知编译器。
      指针保存函数:返回值类型(*p)(参数列表)

定义函数
将函数的三要素定义出来即可实现
调用函数
使用函数名即可实现

函数名是地址的思想非常重要,知道函数名的地址就可以对函数进行高效率的操作

输入参数分为实参和形参
调用者通过:函数名(要传递的数据----实参)进行调用
被调用者通过:函数名(接收的数据----形参)被调用
实参通过拷贝(按位逐一复制)传递给形参

值传递形如fun(a,b);
用于情形:
将实参列表的值复制拷贝到函数执行,结果不会改变实参。上层调用者,保护自己空间值不被修改,仅仅使子函数利用上层空间的值进行处理。功能单一。

地址传递形如fun(&a,&b);
用于情形:
将实参列表的地址指针传入函数,使函数能够修改实参。上层调用者让下层子函数修改自己空间值的方式。连续空间的传递,函数与函数之间的调用关系。(比如将传感器采集的信息进行格式转换,得到其他应用能够识别的格式)

连续空间传递的格式:
采用

  1. 数组
    数组名——标签
    实参:
    int abc【10】;
    fun(abc)
    形参:void fun(int *p)或者void fun(int p【】)
  2. 结构体
    结构体变量
    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,…)

连续空间的传递:
空间传递的需求包括

  1. 子函数查看空间里的情况。
  2. 子函数反向修改上层空间里的内容

字符空间与非字符空间结束标志不同。
字符空间的结束符为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()函数。

函数返回值的概念:
基本语法:

  1. 被调用者:

    返回类型 函数名称(输入列表)
    {
    return
    }

  2. 调用者:
    需要用一个参数来接收函数返回值。——参数=fun();

函数的返回类型不可能是任意类型。
只能返回两种类型:1. 基本数据类型2. 连续空间类型

返回基本数据类型包括int,char,short等标准类型,也可以是结构体
但是结构体传递冗余度大,工程上不建议使用,多用指针来代替。

返回连续空间类型:指针作为指针返回的唯一数据类型
作为函数的设计者,必须保证函数返回的地址所指向的空间是合法的。不是局部变量。
方法有三:

  1. 用static修饰调用函数的参数,使其保存在静态区,能够正常返回。
  2. 返回字符串这样保存在只读区的数据。
  3. 堆区,用malloc函数申请堆区空间。

使用者根据函数的返回类型,定义一个相同的数据类型接收即可。

函数内部实现框架

基本数据类型 fun(void)
{
  基本数据类型 ret;
  //XXXXXXXXXX
  return ret;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值