1.问题的提出
函数的参数不仅可以是整型、实型和字符型,还可以是指针类型。当是指针类型时,它的作用是将一个变量的地址传送到另一个函数中。在C语言中,函数参数的传递单向值传递。数值只能从调用函数向被调用函数传递,不能反过来传递,形参值的改变不会反过来影响实参值的改变。例7.3就试图用一个被调用函数实现主调函数中变量值的改变,但这是无法实现的。
【例7.3】试图交换变量值的程序。
程序如下:
运行结果:
此例中,i和j的值正确传入了swap()中,a和b是swap()的两个形参。a和b的值是由i和j复制得到的,是i和j的一个副本。在swap()调用返回时,a和b两个形参的生命周期结束,但它们的值并没有被复制到实参i和j中。因此,一旦返回,i和j的值将保持不变,swap()的交换功能也没得到体现。
2.解决方法
解决问题的方法是用指针作为函数参数,传给swap()的应是想交换的两个变量的地址,而地址可用指针来刻画。
【例7.4】使用指针参数将改变带回到调用函数。
程序如下:
运行结果:
before calling:i=253 j=86
in the function swap:*a=86 *b=253
after calling:i=86 j=253
该例使用指针作为参数,函数改变参数的值后,能将改变带回到调用函数。swap()的参数是两个指向整型变量的指针变量,所以主函数在调用时必须使用&i、&j来传递参数。
传入函数的实参i和j的地址被复制给swap()的形参a和b,a和b也是指针。在swap()里,改变的不是a和b的值,而是*a和*b的值。*运算符可以得到指针所指向内存空间的内容。*a取得的是存在a中的地址的值,现在a中存储的地址是i的地址,因此*a在本程序中等价于i。同样的道理,*b等价于j。函数将i和j的内容交换,当返回值后,&i和&j的值(地址)仍不变,而i和j的值却改变了。
提示:
①在调用函数时千万注意参数的类型,如果是指针,务必要传地址,否则后果不可预料。
②不能通过改变指针形参的值而使指针实参的值改变。如下代码,就不能实现以上结果。
3.程序实例
【例7.5】输入a、b、c这3个数,按由大到小的顺序输出。
程序如下:
运行结果:
这里限定了swap、exchange的返回类型是void,因此要得到输出值就必须传递三个数值的地址。总之,若希望通过函数调用改变一个或多个变量的值,可以采用传送相应变量的地址的方法。
综合案例引入和本节C语言指针及指针变量相关知识,理解和掌握各种数据在计算机中的存储及运算方式。总结如下:(www.daowen.com)
1.每天都有目标,且当日事当日毕。即每天都要有计划,对当天发生的各种问题,在当天弄清原因,分清责任,及时采取措施进行处理,防止问题积累。
2.分散、平衡处理事情。如果感觉事情太多,就将事情分成自己能处理的零散事情,且权重平衡,分清轻重缓急,最终完成任务。
1.变量的指针,其含义是指该变量的( )。
A.值 B.地址 C.名 D.一个标志
2.若有定义:int x,*pb;则以下正确的表达式是( )。
A.pb=&x B.pb=x C.*pb=&x D.*pb=*x
3.以下程序的输出结果是( )。
A.因变量无定义输出不定值 B.0
C.-1 D.1
4.若有语句int*point,a=4;和point=&a;下面均代表地址的一组选项是( )。
A.a,point,*&a B.&*a,&a,*point
C.*&point,*point,&a D.&a,&*point,point
5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是( )。
A.*p表示的是指针变量p的地址
B.*p表示的是变量a的值,而不是变量a的地址
C.*p表示的是指针变量p的值
D.*p只能用来说明p是一个指针变量
6.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的正确输出结果是( )。
A.23 B.24 C.25 D.26
7.有以下程序
程序运行后的输出结果是( )。
A.1,2,1,2 B.1,2,2,1 C.2,1,2,1 D.2,1,1,2
8.图7-3为本学期汽车制造类专业同学的课表,请同学们结合本节课所学指针内容,帮他们编写一个程序,通过输入星期和节次,输出课表中所对应的课程名及授课地点等信息。
图7-3 汽车制造类专业课表
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。