7.4参数的传递 7.4.1普通值传递 冷值传递方式所传递的是参数值。调用函数时,将实参的值 计算出来传递给对应的形参 说明: (1)实参可以是常量或表达式,也可以是函数调用语句, 如以下函数调用: num of _ primes(4,1000) num of primes(5, x*y), abs sum(abs sum(x, y), z)=3 都是正确的。 (2)实参与形参不共用存储单元,即使同名,形参值的改 变也不会影响主凋函数实参变量的值 (3)实参与形参的类型应该匹配,由实参将数据传送给形 (4)对于有返回值的函数,调用时若没有把它赋给某个变 量,仍然是可以的,只是函数的返回值有可能会被丢失
7.4 参数的传递 7.4.1 普通值传递 ❖ 值传递方式所传递的是参数值。调用函数时,将实参的值 计算出来传递给对应的形参。 ❖ 说明: (1)实参可以是常量或表达式,也可以是函数调用语句, 如以下函数调用:num_of_primes(4,1000)、 num_of_primes(5,x*y)、abs_sum(abs_sum(x,y),z)等, 都是正确的。 (2)实参与形参不共用存储单元,即使同名,形参值的改 变也不会影响主凋函数实参变量的值。 (3)实参与形参的类型应该匹配,由实参将数据传送给形 参。 (4)对于有返回值的函数,调用时若没有把它赋给某个变 量,仍然是可以的,只是函数的返回值有可能会被丢失
74.2地址值传递 令地址值传递指的是调用时给出的实参是变量的地址值, 此时函数参数(形参)应该是指针变量 形参指针得到某变量的地址值后,形参指针就直接指向 该变量,所以在执行函数体的过程中形参指针通过间接 访问可以改变这个变量的值,这是地址值传递的特点, 利用这一点,在需要时调用函数后可以“返回”多个值。 但是地址值的调用还是传值调用,此时传的是地址值, 其传值的单向性没有改变,即形参指针在函数执行过程 中的改变不影响实参(地址值)
7.4.2 地址值传递 ❖ 地址值传递指的是调用时给出的实参是变量的地址值, 此时函数参数(形参)应该是指针变量。 ❖ 形参指针得到某变量的地址值后,形参指针就直接指向 该变量,所以在执行函数体的过程中形参指针通过间接 访问可以改变这个变量的值,这是地址值传递的特点, 利用这一点,在需要时调用函数后可以“返回”多个值。 但是地址值的调用还是传值调用,此时传的是地址值, 其传值的单向性没有改变,即形参指针在函数执行过程 中的改变不影响实参(地址值)
7.5嵌套调用和递归调用 7.5.1嵌套调用 令函数的嵌套调用指的是函数调用函数,实际上前面的程 序中都有主函数调用常用的输入输出函数,或调用数学 函数,或调用字符串函数,或调用自定义函数的例子, 只不过是主函数在调用它们而已,从广义来说也是嵌套 调用。 令函数的嵌套调用更多的是指函数的连环调用 令函数嵌套调用过程中,每次调用函数时系统都要开辟 个新的内存区域用来存放被调用函数的代码和记录当时 调用函数的状态和返回地址等。所以嵌套调用层次越多, 时空开销越大(即运行时间长,占用内存空间多)
7.5 嵌套调用和递归调用 7.5.1 嵌套调用 ❖ 函数的嵌套调用指的是函数调用函数,实际上前面的程 序中都有主函数调用常用的输入输出函数,或调用数学 函数,或调用字符串函数,或调用自定义函数的例子, 只不过是主函数在调用它们而已,从广义来说也是嵌套 调用。 ❖ 函数的嵌套调用更多的是指函数的连环调用。 ❖ 函数嵌套调用过程中,每次调用函数时系统都要开辟一 个新的内存区域用来存放被调用函数的代码和记录当时 调用函数的状态和返回地址等。所以嵌套调用层次越多, 时空开销越大(即运行时间长,占用内存空间多)
7.5.2递归调用 一个函数在它的函数体内调用它自身称为递归调用。在 递归调用中,主调函数又是被调函数。执行递归函数将 反复调用其自身,每调用一次就进入新的一层。 C语言中允许在函数中调用函数自身,或函数之间相互 调用,这种调用方式称之为递归。根据不同的调用方式, 递归又分为直接递归调用和间接递归调用 令直接递归调用:函数直接调用自身 间接递归调用:函数互相调用对方 令在递归函数的调用中,问题的求解分为两个阶段:第一 阶段是“回推”,即从所要求的问题回推到递归的结束 条件处;第二阶段是“递推”,即再从递归的结東条件 递推到要求的问题,这时才可以求出结果
7.5.2 递归调用 ❖ 一个函数在它的函数体内调用它自身称为递归调用。在 递归调用中,主调函数又是被调函数。执行递归函数将 反复调用其自身,每调用一次就进入新的一层。 ❖ C语言中允许在函数中调用函数自身,或函数之间相互 调用,这种调用方式称之为递归。根据不同的调用方式, 递归又分为直接递归调用和间接递归调用。 ❖ 直接递归调用:函数直接调用自身。 ❖ 间接递归调用:函数互相调用对方。 ❖ 在递归函数的调用中,问题的求解分为两个阶段:第一 阶段是“回推”,即从所要求的问题回推到递归的结束 条件处;第二阶段是“递推”,即再从递归的结束条件 递推到要求的问题,这时才可以求出结果
7.6指针与函数 7.61指针变量作函数参数 dfincludesstdio. h> void swap(int, int) void maino i int a=5, b=9; printf( %d, %d\n", a, b) swap(a, b) printf(%d, %d\", a, b); void swap(int x, int y) i int temp temp=X, X-y, y=temp; 1
7.6 指针与函数 ❖ 7.6.1指针变量作函数参数 #include<stdio.h> void swap(int,int); void main() { int a=5,b=9; printf("%d,%d\n",a,b); swap(a,b); printf("%d,%d\n",a,b);} void swap(int x,int y) { int temp; temp=x; x=y; y=temp;}