宿州集团网站建设,app制作下载,搜索引擎营销的优缺点,网站上线模板前言#xff1a;
思维导图#xff1a; 7.3.1 函数调用的形式
我的笔记#xff1a;
函数调用的形式 在C语言中#xff0c;调用函数是一种常见的操作#xff0c;主要有以下几种调用方式#xff1a;
1. 函数调用语句 此时#xff0c;函数调用独立存在#xff0c;作为…
前言
思维导图 7.3.1 函数调用的形式
我的笔记
函数调用的形式 在C语言中调用函数是一种常见的操作主要有以下几种调用方式
1. 函数调用语句 此时函数调用独立存在作为一个完整的语句。例如
print_star();
在这种情况下函数不需要返回值只需完成某些操作。调用语句的末尾需要加分号。
2. 函数表达式 函数调用作为另一个表达式的一部分例如
c max(a, b);
此处max(a, b) 是一个函数调用存在于赋值表达式中。在这种情况下函数需要返回一个确定的值以参与表达式的其他运算。例如
c 2 * max(a, b);
3. 函数参数 函数调用可以作为另一个函数调用的实参。例如
m max(a, max(b, c));
在这个例子中max(b, c) 是一次函数调用它的返回值作为第二次 max 函数调用的实参。
另外函数调用可以作为其他函数如 printf的参数。例如
printf(%d, max(a, b));
注意事项 - 调用无参函数时括号不能省略如 print_star()。 - 如果函数调用语句末尾需要加分号而作为表达式或参数时不应加分号。 - 如果实参表列有多个实参各参数间应用逗号隔开。
示例
//调用无参函数
print_star();//调用有参函数
c max(a, b);
m max(a, max(b, c));
printf(%d, max(a, b));
错误示范
printf(%d, max(a, b););
//这里max(a,b)后面多了一个分号这是不正确的。 7.3.2 函数调用时的数据传递
我的笔记
1. 形式参数和实际参数 - **形式参数形参**定义函数时函数名后的括号中的变量。 - **实际参数实参**调用函数时函数名后的括号中的参数。
实际参数可以是常量、变量或表达式。
int max(int x, int y)
{int z;z x y ? x : y;return(z);
}
2. 实参和形参间的数据传递 - 实参的值会传递给形参。 - 形参获取实参的值该值在函数调用期间有效。 - 实参与形参间的数据传递称为“虚实结合”。
示例
#include stdio.hint main()
{int a, b, c;printf(please enter two integer numbers:);scanf(%d,%d, a, b);c max(a, b);printf(max is %d\n, c);return 0;
}
在这个例子中a 和 b 是实参而 x 和 y 是形参。实参 a 和 b 的值会传递给形参 x 和 y。
注意事项 1. 实参可以是常量、变量或表达式例如max(3, ab)。实参与形参的类型应该相同或赋值兼容。 2. 如果实参和形参类型不同会进行类型转换。例如如果实参是 float 类型值为 3.5而形参是 int 类型则实参会转换为 int 类型即 3再传递给形参。
程序分析 1. 在定义 max 函数时指定了两个 int 类型的形参 x 和 y。 2. 主函数中通过 max(a, b) 调用了 max 函数其中 a 和 b 作为实参传递给了形参 x 和 y。 3. 在 max 函数中将较大的值赋给变量 z并作为函数值返回给主函数赋给变量 c。
总结 在函数调用过程中实参的值会传递给形参允许在被调用函数中使用实参的值进行运算。实参和形参应当类型相同或兼容不同类型间会进行必要的类型转换。 7.3.3 函数调用的过程 我的笔记
1. 形参的内存分配 - 在没有函数调用发生时定义在函数中的形参不占内存中的存储单元。 - 函数被调用时形参才会被临时分配内存单元。
2. 实参值的传递 - 函数调用时实参的值会被传递给对应的形参。 - 如如果实参的值为2那么这个值会被传递给形参x此时形参x的值就会变成2。
3. 形参的运算 - 形参在函数调用期间会持有值因此我们可以利用这些形参进行相关的运算。
4. 返回值 - 通过 return 语句函数值会被带回到主调函数。 - 返回值的类型应该与函数的类型一致。 - 如果函数不需要返回值则不需要 return 语句并且函数的类型应定义为 void 类型。
5. 调用结束后的处理 - 函数调用结束后形参单元会被释放。 - 实参单元会被保留并且保持原值不变。 - 如果在被调用函数的执行过程中形参的值发生了改变这不会影响到主调函数中的实参的值。
6. 值传递 - 实参向形参的数据传递是“值传递”是单向传递。 - 实参和形参在内存中占有不同的存储单元。 - 由于实参和形参位于不同的存储单元实参无法获取形参的值。
总结 函数调用的过程中涉及到形参的内存分配、实参值的传递、形参的运算以及返回值的处理等多个环节。实参和形参间的数据传递是通过值传递的方式进行即实参的值会被复制给形参但实参和形参是独立的存储单元它们之间的值是独立的改变形参的值不会影响实参的值。
我的理解
函数调用过程可以被比喻为一场精心组织的演出。在这场演出中形参可以看作是演员实参是演员所扮演的角色而函数体则是演员们所要遵循的剧本。
### 1. **形参的内存分配** - **比喻** 形参像是演员在剧本中的角色名称尚未被具体的演员扮演时它还不具有实体。 - **解释** 当函数被调用时形参才会被赋予实体即在内存中分配具体的存储单元。
### 2. **实参值的传递** - **比喻** 实参是具体的演员他们根据剧本函数体中角色的要求扮演各自的角色。 - **解释** 在函数调用时实参的值会被传递给形参形参得到具体的值以便后续的计算和操作。
### 3. **形参的运算** - **比喻** 形参在演出中根据剧本的指示进行演绎发挥着各自的角色。 - **解释** 形参在函数体内进行各种运算完成函数体内定义的任务。
### 4. **返回值** - **比喻** 演出完毕后观众主调函数会得到一个总体的表演效果返回值。 - **解释** 函数执行完毕后通过 return 语句返回一个值给主调函数。这个值应该与函数声明时的类型一致。
### 5. **调用结束后的处理** - **比喻** 演出完毕后演员退出舞台他们扮演的角色也随之消失。 - **解释** 函数调用结束后形参所占用的内存单元被释放。但是实参依然保留其值。
### 6. **值传递** - **比喻** 演员扮演角色时他们不会改变角色原有的性格和设定角色的设定是固定的。 - **解释** 实参的值会被复制给形参但是形参和实参是两个不同的存储单元改变形参的值不会影响到实参的值。
### 严谨科学的总结 函数调用过程中形参在开始时并没有内存分配只有在函数调用时才会在内存中占有存储单元。实参的值会被复制给形参进行函数内部的运算。运算完成后通过 return 语句将结果返回给主调函数。这个过程是一种“值传递”的过程形参和实参在内存中位于不同的存储单元它们之间是独立的形参的变化不会影响实参。 7.3.4 函数的返回值这里曾经考察过 我的笔记
简述 函数的返回值是通过return语句在函数中获得的。此值会带回到主调函数中。有时返回值的类型可以自动进行类型转换但最佳实践是让函数类型与 return 返回值的类型一致。
#### 笔记
1. **返回值获取** - 函数的返回值通过return语句在被调用函数中获得并传递回主调函数。 - return语句后的值可以是一个表达式比如return(x y ? x : y);。
2. **返回值用途** - 函数的返回值用于在主调函数中得到一个确定的值如 c max(a, b);。 - 函数 max(2,3) 的返回值是 3而 max(5,3) 的返回值是 5。
3. **返回值类型** - 函数返回值应有明确的类型并在定义函数时指定如 int max(float x, float y)。 - 如果 return 语句中的表达式类型与函数类型不一致会按照函数类型进行转换。但最佳实践是保持一致。
4. **类型转换和清晰度** - 即便可以利用类型转换在一些情况下得到不同类型的返回值但这会降低程序的清晰度和可读性。 - 建议初学者使函数类型与 return 返回值的类型保持一致。
5. **void 类型** - 对于不需要返回值的函数应定义为 void 类型这会使系统确保函数不会带回任何值。 - 在 void 类型的函数中不应该出现 return 语句。
6. **例子分析** - 当函数定义为 int 型而 return 语句中的变量为 float 型时将按赋值规则处理先将变量的值转换为 int 型。 - 例在 max 函数中如果变量 z 为 float 型其值为 2.6那么返回给主调函数的值将是 2。
7. **规范性和维护性** - 应养成在定义函数时一律指定函数类型的习惯这样的程序规范、易读、易于检查维护。
#### 举例代码
#include stdio.h
int main() {int max(float x, float y);float a, b;int c;scanf(%f,%f,, a, b);c max(a, b);printf(max is %d\n, c);return 0;
}int max(float x, float y) {float z;z x y ? x : y;return(z);
}
在这个例子中max 函数比较两个 float 类型的值并返回较大的一个。由于函数返回类型为 int所以 float 类型的 z 在返回时会转换为 int 类型。 总结
在学习函数调用时要特别注意函数的定义、声明、参数传递和返回值。理解这些概念并通过大量的实践来巩固这些知识可以避免许多常见的错误并且是学习更复杂编程概念的基础。同时要特别注意类型的一致性和变量的作用域确保在编写程序时不会出现相关的错误。
调用函数 - 重点、难度与易错点
#### 重点 1. **函数定义与声明** 函数的定义包含了具体的实现而声明通常出现在头文件中通知编译器函数的存在。
2. **参数传递** 理解参数是如何传递的包括值传递和引用传递这是实现更复杂逻辑时的基础。
3. **返回值** 函数可以返回一个值通过 return 语句来实现。必须清楚函数的返回类型并使 return 语句与之匹配。
4. **作用域** 理解变量的作用域局部变量与全局变量的区别和使用场景。
5. **调用过程** 了解函数被调用时的执行流程以及调用者和被调用者之间是如何交互的。
#### 难度 1. **参数传递理解** 新手可能会对值传递和引用传递感到困惑不清楚变量在函数间是如何传递和修改的。
2. **递归调用** 如果本节包含递归调用那么理解递归调用的执行过程和调用栈可能会有些难度。
3. **类型一致性** 保持函数定义类型、return 语句和调用处类型的一致性可能需要一些时间来掌握。
#### 易错点 1. **类型不一致** 函数的返回值类型与 return 语句不匹配或与接收返回值的变量类型不匹配是一个常见的错误。
2. **遗漏返回值** 忘记在需要返回值的函数中加 return 语句或在 void 类型的函数中加了 return 语句。
3. **参数传递错误** 错误地使用值传递或引用传递导致函数内外的变量未按预期改变。
4. **作用域混淆** 对全局变量和局部变量的作用域不清晰可能导致变量的错误使用。
5. **递归终止条件缺失** 如果涉及递归缺少或错误的递归终止条件会导致程序运行错误。