函数06 - 零基础入门学习C语言37
2010-12-23 02:17
671 查看
第七章:函数06
让编程改变世界Change the world by program
To iterate is human, to recurse divine.
— L.Peter Deutsch
[caption id="attachment_131" align="aligncenter" width="300"]
汉诺塔难题[/caption]
由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤:
(1) 将A上n-1个盘借助C座先移到B座上。
(2) 把A座上剩下的一个盘移到C座上。
(3) 将n-1个盘从B座借助于A座移到C座上。
主要程序实现
[codesyntax lang="c"]void hanoi(int n, char one, char two, char three) /* 定义hanoi函数,将n个盘从one座借助two座,移到three座 */ { void move(char x, char y); /* 对move函数的声明 */ if(n==1) move(one, three); else { hanoi(n-1, one, three, two); move(one, three); hanoi(n-1, two, one, three); } } void move(char x, char y) /* 定义move函数 */ { printf(“%c-->%cn", x, y); }
[/codesyntax]
数组作为函数参数
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式。一种是把数组元素(下标变量)作为实参使用;
另一种是把数组名作为函数的形参和实参使用。
数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
例题训练:
判别一个整数数组a[10] = {1, 2, 3, 4, -1, -2, -3, -4, 2, 3}中各元素的值,若大于0则输出该值,若小于等于0则输出0值。
数组名作函数参数
用数组名作函数参数与用数组元素作实参有几点不同:1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。
因此,并不要求函数的形参也是下标变量。
换句话说,对数组元素的处理是按普通变量对待的。
然而,用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。
当形参和实参二者不一致时,即会发生错误。
2) 在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。
在函数调用时发生的值传送是把实参变量的值赋予形参变量。
在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。
为什么?
因为实际上形参数组并不存在,编译系统不为形参数组分配内存。
那么,数据的传送是如何实现的呢?
在此之前我们曾介绍过,数组名就是数组的首地址。
因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。
形参数组名取得该首地址之后,也就等于有了实在的数组。
实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
[codesyntax lang="c"]
#include <stdio.h> void test(int b[10]); void main() { int a[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; test(a); putchar('n'); } void test(int b[10]) { int i = 0; for( ; i < 5; i++ ) { printf("%d ", b[i]); } }
[/codesyntax]
内存数组的存储:
[caption id="attachment_132" align="aligncenter" width="300"]内存数组的存储[/caption]
思考并讨论以下例题:
有一个一维数组score,内放10个学生成绩,求平均成绩(写一个average函数求平均成绩)。
大家在我“出手”前先暂停视频思考一下吧~
[codesyntax lang="c"]
#include <stdio.h> double average(double array[10]); /* 函数声明 */ void main() { double score[10] = {82, 100, 87.5, 89, 78, 85, 67.5, 92.5, 93, 94}, result; result = average(score); printf("average score is %5.2lfn", result); putchar('n'); } double average(double array[10]) { double result = 0; int i = 0; for( i=0; i < 10; i++ ) { result += array[i]; } result /= 10; return result; }
[/codesyntax]
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LWOARVVWJMBQ']视频下载[/Downlink]
相关文章推荐
- 函数06 - 零基础入门学习C语言37
- 函数02 - 零基础入门学习C语言33
- 指针06 - 零基础入门学习C语言46
- 函数07 - 零基础入门学习C语言38
- 数据类型,运算符和表达式05 - 零基础入门学习C语言06
- 函数09 - 零基础入门学习C语言40
- 数据类型,运算符和表达式05 - 零基础入门学习C语言06
- 函数01 - 零基础入门学习C语言32
- 循环控制结构程序06 - 零基础入门学习C语言21
- 函数01 - 零基础入门学习C语言32
- 函数08 - 零基础入门学习C语言39
- 循环控制结构程序06 - 零基础入门学习C语言21
- 函数08 - 零基础入门学习C语言39
- 数组06 - 零基础入门学习C语言28
- 更灵活的定位内存地址的方法06 - 零基础入门学习汇编语言37
- 数组06 - 零基础入门学习C语言28
- 更灵活的定位内存地址的方法06 - 零基础入门学习汇编语言37
- 函数05 - 零基础入门学习C语言36
- 函数05 - 零基础入门学习C语言36
- 函数03 - 零基础入门学习C语言34