ARM架构与C语言(韦东山)学习笔记(4)-函数

一、函数是什么?main函数和其他函数有什么区别?

1.在C语言中,函数是一段可重用的代码块,用于完成特定的任务或计算,并且可以接受参数和返回值。函数通常有一个名称和一组参数,可以在程序中多次调用,以实现代码的复用和模块化。

函数在C语言中有以下特点:
函数可以接受参数,用于传递数据给函数。
函数可以返回值,用于将处理结果返回给调用者。
函数可以在程序中多次调用,以实现代码的复用和模块化。
函数可以和其他函数组合使用,以实现复杂的计算和处理逻辑。
函数可以使用局部变量和全局变量,用于存储和处理数据。
在C语言中,main()函数是程序的入口点,也是程序开始执行的地方。从程序开始执行到程序结束,所有的函数都是在main()函数的调用链中被调用的。

2.与其他函数相比,main()函数有以下几个特点:

main()函数是程序的入口点,是程序开始执行的地方。
main()函数没有参数,或者有两个参数,分别为argc和argv,用于接收命令行参数。
main()函数的返回值类型是int,表示程序的执行结果。通常情况下,返回0表示程序执行成功,返回其他值表示程序执行失败。
main()函数只能有一个,且必须定义在程序的顶层作用域中。
main()函数的函数体中可以调用其他函数,以实现复杂的计算和处理逻辑。
其他函数与main()函数相比,通常都是用于实现特定的功能或计算任务,可以接受参数和返回值,也可以调用其他函数实现复杂的计算和处理逻辑。但与main()函数不同的是,其他函数不是程序的入口点,只有在main()函数的调用链中被调用才能执行。

二、函数的形参和实参是什么?

形参是函数定义中的变量,用于接收函数调用时传递进来的参数
实参是函数调用时传递给函数的参数,可以是常量、变量、表达式或其他函数的返回值
在函数调用时,实参的值被复制到对应的形参中,函数内部使用的是形参的值。
对形参的修改不会影响实参的值,因为形参只是实参的一个副本。
函数可以接受多个参数,参数之间用逗号分隔。
例如:在这里插入图片描述
u32 bound就是函数uart_init的形参,在主函数调用该函数时,使用:uart_init(115200),那么115200就是实参。

三、函数的递归

在C语言中,递归是指函数调用自身的行为。递归函数是一种强大的编程技术,可以用来解决许多复杂的问题,但也需要谨慎使用,避免产生无限递归的情况。

递归函数的实现通常包含以下两个部分:
递归结束条件:定义递归函数的结束条件,当满足某个条件时,递归函数不再调用自身,而是返回结果。
递归调用:在递归函数体中调用自身,以便对问题进行分解和处理。递归调用通常使用递归函数的形式参数和局部变量来存储和处理数据。

递归函数的实现需要注意以下几个问题:
递归函数需要定义好结束条件,否则会产生无限递归的情况,导致栈溢出等问题。
递归函数的调用过程会占用大量的栈空间,如果递归层数过多,可能会导致栈溢出等问题。
递归函数的效率通常比循环实现低,因为递归调用需要额外的函数调用开销和栈空间开销。
下面是一个简单的递归函数示例,用于计算n的阶乘:

int factorial(int n) {
    
    
    if (n == 0) {
    
    
        return 1;
    } else {
    
    
        return n * factorial(n - 1);
    }
}

在上面的例子中,factorial()函数是一个递归函数,用于计算n的阶乘。递归结束条件是n等于0,此时返回1。否则,递归调用factorial()函数,并将n的值减1传递给递归函数。最终,递归函数返回n和factorial(n-1)的乘积。

例如,以下是一个调用factorial()函数的示例:

int result = factorial(5);

在上面的例子中,factorial()函数被调用,并传递了整数参数5作为实参。函数内部使用递归调用,将5、4、3、2、1作为实参传递给递归函数,并计算它们的乘积。最终,函数返回的结果120被赋值给变量result。

四、常用库函数

C语言提供了大量的标准库函数,用于实现各种不同的功能。这些函数可以直接调用,无需自己编写实现代码。以下是C语言中常用的一些标准库函数:

字符串处理函数:

1.strlen():计算字符串的长度

函数原型:size_t strlen(const char *s);
函数功能:计算字符串的长度,不包括空字符’\0’。
函数参数:s为要计算长度的字符串的指针。
函数返回值:返回字符串的长度。
示例代码:

char str[] = "hello world";
int len = strlen(str); // len的值为11

2.strcpy():将一个字符串复制到另一个字符串

函数原型:char *strcpy(char *dest, const char *src);
函数功能:将一个字符串复制到另一个字符串。
函数参数:dest为目标字符串的指针,src为源字符串的指针。
函数返回值:返回目标字符串的指针。
示例代码:

char src[] = "hello world";
char dest[20];
strcpy(dest, src); // dest的值为"hello world"

3.strcat():将一个字符串追加到另一个字符串

函数原型:char *strcat(char *dest, const char *src);
函数功能:将一个字符串追加到另一个字符串。
函数参数:dest为目标字符串的指针,src为源字符串的指针。
函数返回值:返回目标字符串的指针。
示例代码:

char str1[20] = "hello ";
char str2[] = "world";
strcat(str1, str2); // str1的值为"hello world"

4.strcmp():比较两个字符串的大小关系

函数原型:int strcmp(const char *s1, const char *s2);
函数功能:比较两个字符串的大小关系。
函数参数:s1和s2为要比较的字符串的指针。
函数返回值:如果s1大于s2,返回一个正整数;如果s1小于s2,返回一个负整数;如果s1等于s2,返回0。
示例代码:

char str1[] = "hello";
char str2[] = "world";
int result = strcmp(str1, str2); // result的值为-15

数学函数:

abs():计算整数的绝对值

int x = -10;
int result = abs(x); // result的值为10

sqrt():计算浮点数的平方根

double x = 16.0;
double result = sqrt(x); // result的值为4.0

pow():计算一个数的幂

double x = 2.0;
double y = 3.0;
double result = pow(x, y); // result的值为8.0

rand():生成一个随机数

int result = rand(); // 生成一个随机数

输入输出函数:

printf():输出格式化的文本
scanf():读取格式化的输入

int x;
scanf("%d", &x); // 从用户输入中读取一个整数并存储在变量x中
float x;
scanf("%f", &x); // 从用户输入中读取一个浮点数并存储在变量x中
char c;
scanf("%c", &c); // 从用户输入中读取一个字符并存储在变量c中
char str[20];
scanf("%s", str); // 从用户输入中读取一个字符串并存储在数组str中

内存操作函数:

malloc():动态分配内存空间
free():释放动态分配的内存空间
上面这两个函数我在第二节和第三节已经学习过了。
memcpy():将一段内存复制到另一个内存
memset():将一段内存设置为指定的字节值
memcpy()函数用于将一段内存复制到另一个内存,需要三个参数:目标内存地址、源内存地址和要复制的字节数。语法如下:

void *memcpy(void *dest, const void *src, size_t n);

memset()函数用于将一段内存设置为指定的字节值,需要三个参数:目标内存地址、要设置的字节值和要设置的字节数。语法如下:

void *memset(void *s, int c, size_t n);

猜你喜欢

转载自blog.csdn.net/qq_53092944/article/details/131112072