指针变量既可以作为函数的形参,也可以作为函数的实参。所以,为了解决通过被调用函数来实现主调函数中变量值的改变,必须使用指针变量作为函数的形参。在执行被调用函数时,使形参指针变量所指向的变量的值发生变化。函数调用完成后,通过不变的实参指针变量将变化的值保留下来。图6.8程序运行结果说明:函数swap 的形参是两个整型指针变量p1 和p2,故主函数在调用时,必须使用变量a 和b 的地址,即&a 和&b 作为实参。......
2023-10-21
用数组名作函数参数时,实参与形参都应用数组名。
例5.5 数组a中存放了一个学生5门课程的成绩,求平均成绩。
本程序首先定义了一个实型函数aver(),有一个形参为实型数组a,长度为5。在函数aver()中,把各元素值相加求出平均值并返回给主函数。主函数main()中首先完成数组sco的输入,然后以sco为实参调用aver()函数,函数返回值送av,最后输出av值。从运行情况可以看出,该程序实现了所要求的功能。
前面已经讨论过,在变量作函数参数时,所进行的值传送是单向的(即只能从实参传向形参,不能从形参传回实参)。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。
而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。当然这种情况不能理解为发生了“双向”的值传递。但从实际情况来看,调用函数之后实参数组的值将随着形参数组值的变化而变化。
形参数组和实参数组的长度可以不相同,因为在调用时程序只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的。
例5.6 把例5.5程序中的形参数组与实参数组的长度修改为一致,并重写程序。
本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。编译能够通过,但从结果看,数组a的元素a[5],a[6],a[7]数值将会导致程序运行出现错误结果。
在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。例如,函数声明可以写为:
void aver(int a[])(www.chuimin.cn)
或
void aver(int a[],int n)
其中,形参数组a没有给出长度,而由n的值动态地表示数组的长度。n的值由主调函数的实参进行传送。由此,例5.5又可改为例5.7的形式。
例5.7 把例5.5程序中的函数的形参数组不指定长度,并改写程序。
本程序aver()函数形参数组a没有给出长度,而由n动态确定该长度。在main()函数中,函数调用语句为aver(sco,5),其中实参5将赋值给形参n作为形参数组的长度。
多维数组也可以作为函数的参数。在函数定义时,形参数组可以指定每一维的长度,也可省去第一维的长度。因此,以下写法都是合法的。
int MA(int a[3][10])
或
int MA(int a[][10])。
有关C语言程序设计 第2版的文章
指针变量既可以作为函数的形参,也可以作为函数的实参。所以,为了解决通过被调用函数来实现主调函数中变量值的改变,必须使用指针变量作为函数的形参。在执行被调用函数时,使形参指针变量所指向的变量的值发生变化。函数调用完成后,通过不变的实参指针变量将变化的值保留下来。图6.8程序运行结果说明:函数swap 的形参是两个整型指针变量p1 和p2,故主函数在调用时,必须使用变量a 和b 的地址,即&a 和&b 作为实参。......
2023-10-21
首先数组元素可以作为实参,其用法与变量完全相同。图5.5程序运行结果说明:用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array 是形参数组名,score 是实参数组名,分别在其所在函数中定义,不能只在一方定义。图5.8程序运行结果用数组名作为函数参数时应注意以下几点:形参数组和实参数组的类型必须一致。......
2023-10-21
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
C语言把括号、赋值、强制类型转换等都作为运算符处理,灵活使用各种运算符可以实现在其他高级语言中难以实现的运算,功能强大。另外,C语言还把括号、下标、强制类型转换、取地址等都作为运算符处理,并通过与算数运算符的组合达到不同的目的,从而使程序更加简洁明了。C语言具有超强的可移植性。总之,C语言在运算符方面是比较容易让人混淆的。......
2023-11-18
指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。......
2023-10-21
C语言的最大特点是:功能强、使用方便灵活。由于这个“灵活”给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。在C语言中大写字母和小写字母是两个不同的字符。C语言规定以’\0’作字符串结束标志,它是由系统自动加上的。当一个语句中使用多层括弧时常出现这类错误。main()C语言中对数组的定义或引用数组元素时必须用方括弧。......
2023-11-18
针对不同的实际应用,数据排序方法有很多种。本节介绍两种常用排序方法的基本思想和实现方法,帮助读者初步理解排序方法的计算机解决思路。②不考虑已排好序的数据,将剩下的数据作为待排序列。编写程序实现冒泡排序算法,对随机生成的10个3位整数按升序进行排序并输出。......
2023-11-20
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
相关推荐