day12.1 C语言初阶——函数参数与调用的定义

本文深入讲解C语言中的函数概念,包括库函数与自定义函数的区别,函数参数的传递方式,如传值调用和传址调用,以及如何正确使用指针实现变量交换。通过具体代码示例,帮助读者理解函数的调用过程和内存管理。

day12.1

谁能横刀立马,唯我飞牛大将军!

涵盖知识点:
库函数与自定义函数
函数参数
函数调用

下面是day12所学到的知识:

函数

1.函数是什么?

函数是子程序。

2.C语言中函数的分类

1.库函数
2.自定义函数

3.库函数

不是业务性的代码,而是为了在开发的过程中,支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

www.cplusplus.com

4.自定义函数

写一个交换数字的程序

#include<stdio.h>
#include<windows.h>

int swap(int x, int y)
{
	printf("swap:交换之前:%d %d\n", x, y);
	int temp = 0;
	temp = x;
	x = y;
	y = temp;
	printf("swap:交换之前:%d %d\n", x, y);
}

int main()
{
	int a = 20;
	int b = 30;
	printf("main:交换之前:%d %d\n", a, b);
	swap(a , b);
	printf("main:交换之后:%d %d\n", a, b);
	system("pause");
	return 0;
}

结果:此时没发生交换,只在swap函数内部进行了交换,但是空间随即被释放,没有swap函数外部产生了影响。
原因,这里发生了实参传给形参时,即形参实例化后其实相当于实参的一份临时拷贝。
在这里插入图片描述
用指针后

#include<stdio.h>
#include<windows.h>

int swap(int *x, int *y)
{
	printf("swap:交换之前:%d %d\n", *x, *y);//形参
	int temp = 0;
	temp = *x;
	*x = *y;
	*y = temp;
	printf("swap:交换之前:%d %d\n", *x, *y);
}

int main()
{
	int a = 20;
	int b = 30;
	printf("main:交换之前:%d %d\n", a, b);
	swap(&a, &b);//实参
	printf("main:交换之后:%d %d\n", a, b);
	system("pause");
	return 0;
}

在这里插入图片描述
5.函数参数
全局变量不存在传参问题

C函数可以不写返回值,但默认是int类型

无参数可传: int GetMax (void)

无返回值 : void GetMax ( int )

实际参数(实参):真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参。

形式参数(形参):形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

形参实例化后其实相当于实参的一份临时拷贝。

6.函数的调用

传值调用:函数的实参和形参分别占有不同的内存块,对形参的修改不会影响实参。

传址调用
<1>传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
<2>这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

### 如何在C语言定义一个接受枚举类型作为参数的函数 在C语言中,可以通过将枚举类型作为形参来实现函数的功能。以下是详细的说明和示例。 #### 枚举类型的定义 枚举类型通过`enum`关键字定义,通常的形式如下: ```c enum TypeName { ValueName1, ValueName2, ValueName3, ... }; ``` 这种结构允许为一系列整数常量赋予有意义的名字[^1]。 #### 函数定义枚举类型参数 当需要定义一个接收枚举类型作为参数的函数时,可以在函数原型和函数体中指定该枚举类型作为形参。例如: ```c #include <stdio.h> // 定义枚举类型 enum Color { RED, GREEN, BLUE }; // 定义一个接受枚举类型作为参数的函数 void displayColor(enum Color color) { switch (color) { case RED: printf("The selected color is Red.\n"); break; case GREEN: printf("The selected color is Green.\n"); break; case BLUE: printf("The selected color is Blue.\n"); break; default: printf("Unknown color.\n"); } } int main() { // 使用枚举常量调用函数 enum Color myColor = GREEN; displayColor(myColor); return 0; } ``` 在这个例子中,`displayColor`函数被设计成接受`enum Color`类型的参数,并根据传入的具体值执行不同的逻辑分支[^4]。 #### 参数传递机制 在C语言中,函数调用涉及两种主要的参数传递方式:按值传递(Pass by Value)和按地址传递(Pass by Reference)。对于枚举类型而言,默认情况下采用的是按值传递的方式。这意味着,在调用函数时,实际参数的值会被复制到对应的形参位置,而不会影响原始的实际参数本身[^2]。 如果希望修改外部变量的内容,则需借助指针或其他间接手段完成此目标;然而这并不适用于单纯的枚举类型场景,因为它们本质上只是命名后的整数值集合[^5]。 --- ### 提高代码质量的小技巧 为了增强程序的可读性和灵活性,可以结合`typedef`进一步简化语法书写过程。比如下面这段改进版代码展示了如何利用`typedef`让后续编码更简洁明了: ```c typedef enum { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } Weekday; void printDay(Weekday day){ char* days[]={"Monday","Tuesday","Wednesday", "Thursday","Friday","Saturday","Sunday"}; if(day >=MONDAY && day<=SUNDAY ){ puts(days[day]); }else{ perror("Invalid Day!"); } } ``` 在这里我们不仅重新封装了一周七天的概念还提供了相应的打印方法以便于其他部分能够方便快捷地访问这些信息资源[^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值