20240802嵌入式学习笔记

函数调用

函数分为调用函数和被调用函数,通常在主函数中用于实现功能的函数我们称为被调用函数。

main函数是程序的入口,只能在在主函数中调用其他函数,但主函数不能被调用。在调用函数时可以嵌套调用。比如在主函数中调用比大小函数,在比大小函数中调用求和函数,最终实现比大小和求和的功能。

函数的调用实际上是利用了栈的结构,实现先入后出保证了函数可以层层嵌套调用。

栈实质上为内存中的一片空间,默认为大小为8mb,自动申请自动释放。栈的空间固定,每一次递归都会占用栈空间,如果递归次数过大则会占满栈空间导致运行错误。

C语言中内存被划分为五个部分:栈、堆、字符串常量区、静态区和代码区

栈:主要用来存放自动变量和函数调用的数据。

堆:手动申请,手动释放的大空间。

字符串常量区:存放字符串常量,且存放内容为只读,不能被更改。

静态区:存放全局变量和静态变量。

递归

递归是一种在函数中自己调用自己的特殊的函数调用.

代码示例:

sum函数是一个求和函数,在sum函数中只有当a等于一时会有实际返回值1,当a不为一时,将a重新输入进了sum函数,将sum(a-1)的结果作为返回值。可以想象a在sum函数中将会不断减小,直到为1,此时才有了确定的值“sum(1) + 1”,作为确定值,他的上一层“sum(2) + 2“也才成为确定值,最终一层一层向上返回确定值,最终回归到开始的第一层”sum(a) + a“,将其作为返回值传递给主函数。这种一层一层回归的方式被称为递归。

int sum(int a)
{
    if(a==1)
        return 1;
    else
        return sum(a-1) + a;
}
sum(100)
  |--sum(99) + 100
       |--sum(98)+99
	        |--sum(97)+98
                ...
                   |--sum(3)+4
                        |--sum(2)+3
                             |--sum(1) + 2
                                 1

递归的思路:遇到问题向上一层走。将多层的问题逐步拆解为可以重复的多层操作。

代码示例:

求阶乘函数

int plus(int a)
{
	if(a==1)
		return 1;
	else
		return plus(a-1) * a;
}

数组作为函数参数

数组元素可以作为函数参数,数组本身也可以作为函数参数。数组元素作函数参数时,可以理解为独立的数,参与函数的计算;数组作函数参数时,需要在形式参数中标明数组名和数组长度。

int strsum(int ary[],int len);    //函数声明

函数名代表数组的数据类型,同时代表首元素的在内存中的地址。形参中的写法”ary [ ]“在编译器中会被理解为”int *ar

y“,表示向函数传递地址,函数接收到地址后的操作直接在原数组的内存空间上进行操作,相比传递值的方式,址传递的方式效率更高,但更加复杂。

在数组名后加下标运算符是表明形参为数组,防止与整型数混淆,但在调用函数时,实参可以直接使用数组标识符。

代码示例:

//打印
void printarray(int a[],int len)
{
	int i;
	for(i=0;i<len;++i)
	{
		printf("a[%d] = %d\n",i,a[i]);
	}
}

//插入升序
void aryinsert(int a[],int len)
{
	int i,tmp;
	for(i=1;i<len;++i)
	{
		tmp = a[i];
		while(i>0 && tmp < a[i-1])
		{
			a[i] = a[i-1];
			--i;
		}
		a[i] = tmp;
	}
}
//二分查找
int arysearch(int a[],int len,int x)
{
	int begin,end,mid;
	begin = 0;
	end = len - 1;
	while(begin <= end)
	{
		mid = (begin + end) /2;
		if(a[mid] < x)
			begin = mid +1;
		else if(a[mid] > x)
			end = mid - 1;
		else
			break;
	}
	if(begin <= end)
		return mid;
	else 
		return -1;
}
//主函数
int main(void)
{
	int max,x;
	int a[] = {3,8,1,-8,6,4,12,5,7};
	int len = sizeof(a)/sizeof(a[0]);

    //打印数组
	printarray(a,len);

    //插入排序
    aryinsert(a,len);

	printf("-------------\n");
	//打印数组
    printarray(a,len);

    //二分查找
	printf("Input x to be found:\n");
	scanf("%d",&x);

	if (arysearch(a,len,x) >= 0)
		printf("a[%d] = %d\n",arysearch(a,len,x),x);
	else 
		printf("Not found\n");


	return 0;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值