@: 1
函数的定义
本小节知识点:
1.自定义函数的书写格式
用户定义函数:由用户自己写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主程序中需声明,然后才能使用。
~~ 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…) ~~ { ~~ 函数体 ~~ } ~~
示例:
“`
~~ int main(){
~~ }
~~ void test1(){
~~ }
“`
2.定义函数的目的
- 将一个常用的功能封装起来,方便以后调用
3.定义函数的步骤
- 函数名:函数叫什么名字
- 函数体:函数是干啥的,里面包含了什么代码
- 返回值类型: 函数执行完毕返回什么和调用者
4.无参无返回值函数定义
格式
~~ void 函数名() ~~ { ~~ 函数体 ~~ }
示例:
“`
~~ void sayHello()
~~ {
~~ printf(“lnj hello”);
~~ }
- 没有返回值时return可以省略
---
## 5.无参有返回值函数定义
- 格式
~~ ```
~~ 返回值类型 函数名()
~~ {
~~ 函数体
~~ return 0;
~~ }
~~ ```
- 示例
~~ ```
~~ int getAge()
~~ {
~~ return 30;
~~ }
~~ ```
---
## 6.有参无返回值函数定义
- 格式
~~ ```
~~ void 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
~~ {
~~ 函数体
~~ }
~~ ```
- 示例
~~ ```
~~ void prtLines(int n)
~~ {
~~ for (int i=0; i<n; i++) {
~~ printf("------");
~~ }
~~ }
~~ ```
- 形式参数表列表的格式:类型 变量名,类型 变量2,.......
---
## 7.有参有返回值函数定义
- 格式
~~ ```
~~ 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,…)
~~ {
~~ 函数体
~~ return 0;
~~ }
~~ ```
- 示例:
~~ int getMax(int number1, int number2)
~~ {
~~ return number1 > number2 ? number1 : number2;
~~ }
~~
---
## 8.函数定义注意
- 函数不能嵌套定义
# 函数的参数
## 本小节知识点:
1. 【理解】形式参数介绍和使用
2. 【理解】实际参数介绍和使用
3. 【理解】形式参数、实际参数注意点
4. 【理解】返回值类型注意点
5. 【理解】return使用注意
---
## 1.形式参数介绍和使用
- 基本概念
+ 形式参数:在定义函数时,函数名后面的小括号()中定义的变量称为形式参数,简称形参
+ 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
int max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
}
“`
2.实际参数介绍和使用
基本概念
- 实际参数:在调用函数时传入的值称为实际参数,简称实参
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
“`
int main()
{
max(88, 99); // 实际参数
return 0;
}
## 3.形式参数、实际参数注意点
- 调用函数时传递的实参个数必须和函数的形参个数必须保持一致
```
int max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
}
int main()
{
max(88); // 报错
return 0;
}
```
- 当使用基本数据类型(char、int、float等)作为实参时,实参和形参之间只是值传递,修改形参的值并不影响到实参函数可以没有形参
```
void change(int number1, int number2) // 形式参数
{
number1 = 250; // 不会影响实参
number2 = 222;
}
int main()
{
int a = 88;
int b = 99;
change(a, b);
printf("a = %d, b = %d", a, b);
return 0;
}
输出结果: 88, 99
```
- 形参实参类型不一致, 会自动转换为形参类型
```
void change(double number1, double number2) // 形式参数
{
printf("number1 = %f, number2 = %f", number1, number2);
}
int main()
{
change(10, 20);
return 0;
}
输出结果: 10.000000, 20.000000
```
---
## 4.返回值类型注意点
- 如果没有写返回值类型,默认是int
```
int max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
}
可以写为
max(int number1, int number2) // 形式参数
{
return number1 > number2 ? number1 : number2;
}
```
---
## 5.return使用注意
- 一个函数内部可以多次使用return语句,使用了return语句后,函数就会马上停止执行,return语句后面的代码就不再被执行
```
~~ int max(int number1, int number2) // 形式参数
~~ {
~~ return number1 > number2 ? number1 : number2;
~~ printf("执行不到"); // 执行不到
~~ return 250; // 执行不到
~~ }
```
- 函数返回值的类型和return实际返回的值类型应保持一致。如果两者不一致,则以返回值类型为准,自动进行类型转换
```
~~ float height()
~~ {
~~ return 175;
~~ }
~~ int main()
~~ {
~~ printf("%d", height());
~~ }
~~ 输出结果: 175.000000
```
---
# 函数的声明
## 本小节知识点:
1. 【理解】函数的声明
---
## 1.函数的声明
- 在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数
- 如果想把函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数的前面进行函数的声明,必须在子函数被调用之前,可以写在函数内部也可以写在函数外部。
- c语言中不可以重复定义相同函数,但是可以重复声明相同函数。
- 函数的声明格式:
+ 返回值类型 被调函数名( 类型 形参, 类型 形参... );
+ 返回值类型 被调函数名( 类型, 类型...);
```
例如:
int max( int a, int b );
int max( int, int );
- main函数调用分析
- main函数时系统规定的名称,系统启动程序就会调用名称叫做main的函数。
-main函数只能由系统调用,不能手动调用 - 关于main的形参的解释
- argc:系统传递传递进来的参数个数
- argv:系统传递进来的参数实际的值
- main函数时系统规定的名称,系统启动程序就会调用名称叫做main的函数。
函数的声明与实现的关系
(img)注意点:
- 如果被调函数的返回值是整型时,可以不对被调函数作说明,而直接调用。这时系统将自动对被调函数返回值按整型处理
int main(int argc, const char * argv[]) { printf("result = %d\n", getMin()); return 0; } int getMin() // 返回int, 不用声明 { return 10; } int getMax() // 返回不是int, 需要声明 { return 10.10; }
” + 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而 直接调用。
float getMax() // 在调用之前定义
{
return 10.10;
}
int main(int argc, const char * argv[])
{
printf("result = %f\n", getMax());
return 0;
}
@: 4
函数的调用
本小节知识点:
- 【理解】函数的调用
- 【掌握】函数的嵌套调用
1.函数的调用
函数调用的一般形式为
- 函数名(实际参数表);
- 对无参函数调用时则无实际参数表。
- 实际参数表中的参数可以是常数,变量或其它构造类型数据及表达式。
- 多个参数各实参之间用逗号分隔。
函数表达式
- 函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数 是有返回值的。
~~
~~ int z=0;
~~ z = max(23, 80) + 1; // 函数表达式
~~
- 函数语句
- 函数调用的一般形式加上分号即构成函数语句。
~~
~~ printf("%d",a);
~~ scanf("%d",&b);
~~
- 函数实参
- 函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因 此要求该函数必须是有返回值的。
~~
~~ printf("%d\n",max(20, 30));
~~
-
2.函数的嵌套调用
- C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表