【时时三省】(C语言基础)指针变量作为函数参数
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
下面通过一个例子来说明。
例题:
对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。
解题思路:
直接在主函数内交换指针变量的值,本题是定义一个函数swap,将指向两个整型变量的指针变量(内放两个变量的地址)作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。
编写程序:
运行结果:
程序分析:
swap是用户自定义函数,它的作用是交换两个变量( a和b )的值。swap函数的两个形参p1和p2是指针变量。程序运行时,先执行main函数,输入a和b的值(现输入5和9 )。然后将a和b的地址分别赋给int *变量pointer _ l和pointer _ 2,使pointer1指向a,pointer _ 2指向b,接着执行if语句,由于a < b,因此执行swap函数。注意实参pointer _ 1和pointer2是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是“值传递”方式。因此虚实结合后形参pl的值为&a,p2的值为&b,这时pl和pointer1都指向变量a,p2和pointer _ 2都指向b。接着执行swap函数的函数体,使* pl和* p2的值互换,也就是使a和b的值互换。函数调用结束后,形参p1和p2不复存在(已释放),最后在main函数中输出的a和b的值已是经过交换的值( a = 9,b = 5 )。
解引用以后是直接改变a和b的值,如果没有解引用就是只改变指针变量的值
*p1就是a,是整型变量。而* temp是指针变量temp所指向的变量。但由于未给temp赋值,因此temp中并无确定的值(它的值是不可预见的),所以temp所指向的单元也是不可预见的。所以,对* temp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状况。应该将*p1的值赋给与* p1相同类型的变量,在本例中用整型变量temp作为临时辅助变量实现* pl和* p2的交换。
注意:本例采取的方法是交换a和b的值,而pl和p2的值不变。可以看到,在执行swap函数后,变量a和b的值改变了。
下面的函数能不能实现a和b互换
如果在main函数中调用swap函数:
swap ( a,b );
会有什么结果呢?
在函数调用时,a的值传送给x,b的值传送给y,执行完swap函数后,x和y的值是互换了,但并未影响到a和b的值。在函数结束时,变量x和y释放了,main函数中的a和b并未互换,也就是说,由于“单向传送”的“值传递”方式,形参值的改变不能使实参的值随之改变。
为了使在函数中改变了的变量值能被主调函( a ) ( b )数所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”的目的。
如果想通过函数调用得到n个要改变的值,可以这样做:
①在主调函数中设n个变量,用n个指针变量指向它们;
②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值;
③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的值,也就是相关变量的地址传给该函数的形参;
④在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值;
⑤主调函数中就可以使用这些改变了值的变量。
例题2:
对输入的两个整数按大小顺序输出。
解题思路:
尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值希望能由此改变实参(指针变量)的值。
编写程序:
运行结果:
程序分析 :
从运行结果看,显然与原意不符。程序编写者的意图是:交换指针变量pointer _ 1和pointer _ 2的值,使pointer _ 1指向值大的变量。其设想是:
①先使pointer _ 1指向a,pointer 2指向b。
②调用swap函数,将pointer _ 1的值传给p1,pointer _2的值传给p2。
③在swap函数中使pl与p2的值交换。
④形参pl与p2将它们的值(是地址)传回实参pointer 1和pointer _ 2,使pointer _ 1指向b,pointer _ 2指向a。然后输出* pointer _ 1和* pointer _ 2,想得到输出“max = 9,min = 5”。
但是,这是办不到的,在输入“5,9”之后程序实际输出为“max = 5,min = 9”。问题出在第4步。
C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量作函数参数时同样要遵循这一规则。不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。要善于利用指针法。
例题3:
输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。
解题思路:
在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。
编写程序:
运行结果:
程序分析:
exchange函数的作用是对3个数按大小排序,在执行exchange函数过程中,要嵌套调用swap函数,swap函数的作用是对两个数按大小排序,通过调用swap函数(最多调用3次)实现3个数的排序。