第10章 指针(七) 应用1------函数间数据的双向传递
2009-03-26 13:08
274 查看
声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704 忠告:函数概念过关的往下看,否则回到函数的相关章节去!!!!! 忠告:指针概念过关的往下看,否则回到指针的前面六节去!!!!! 警告:上述2个内容没有过关的,往下看,无异于对你学习指针信心的自杀!因为在下面,我将不再把你当作最初级的程序学习者,不再做最初级的解释了,我假设,你已经是进阶者! 函数的参数不仅可以是整型、实型、字符型等数据,还可以是变量的指针,它将一个变量的首地址从主调函数传送到另一个函数中,以间接的方式,实现了函数间数据的双向传递。谭浩强先生用一个简单的例子:输入两个整数,按大小顺序输出,用函数处理,说明了指针的这类应用。 1、【例】输入的两个整数按大小顺序输出, 用函数处理,而且用指针类型的数据作函数参数。 swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("/n%d,%d/n",a,b); } 对程序的说明: swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。 接着执行if语句,由于a〈b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。 函数调用结束后,p1和p2不复存在(已释放)如图。 最后在main函数中输出的a和b的值是已经过交换的值。 进一步分析如下: 表面上看,由于a和b是main()的局部变量,他们的作用域就是main()的函数体,因此a,b对于swap()是不可见的,即swap()不能对a和b赋值,也不能使用a和b中的数据进行运算; 但是,当我们通过使用指针参数pointer1和pointer2,将&a、&b这2个地址从main()传入了swap();那么,swap()通过该地址,就可以找到main()的a,b,从而使得swap()就象main()一样,可以直接对a、b赋值,或直接用a、b中的值进行运算。 这样一来,主调函数main()可以存取a、b,而被调函数swap()通过传入的地址,也可以存取a、b。我们说a、b在main()和swap()间被共享了。 既然变量都被共享了,那么main()就可以通过a、b给swap()传送数据;同理swap()也可以通过a、b给main()传送数据了,这就是说,我们实现了这2个函数间的双向数据传递。 恰可谓明修栈道,暗渡陈仓!!! 2、请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误: swap(int *p1,int *p2) {int *temp; *temp=*p1; /*此语句有问题*/ *p1=*p2; *p2=temp; } 上面的错误在于int *temp是一个野指针!!!当你定义了一个指针A,但是没有明确指定A指向哪个变量,那么A就叫野指针; 一定要给你的指针变量赋初值,不要让他成为野指针,否则他会桀骜不驯,成为一个很危险的东西。 遥想当年,他搞死过我的程序,也使我的系统死过机,甚至摧毁了我的操作系统.......;你要格外小心,不要让世界末日降临。 3、请考虑下面的函数能否实现实现a和b互换。 swap(int x,int y) {int temp; temp=x; x=y; y=temp; } 如果在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?请看下图所示。 上面的分析,再次验证了函数参数的单向值传递原则!!! 4、【例】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。 swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; } main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("/n%d,%d/n",*pointer_1,*pointer_2); } 其中的问题在于不能实现如图所示的第四步(d)。 函数使用指针作为参数时,作为函数参数的一种,指针参数仍然也必须遵守单向值传递的原则,即指针参数中地址在被调函数中的改变,不会返回到主调函数 |
相关文章推荐
- 第10章 指针(七) 应用1------函数间数据的双向传递
- 第10章 指针(七) 应用1------函数间数据的双向传递
- 关于C语言通过函数传递多个数据————指针的应用
- C++函数传递指向指针的指针的应用
- p303 使用指针给函数传递数据
- 使用void指针给函数传递不同的数据类型
- 指针作为函数参数传递 (转载)
- 指针和引用作为函数传递参数
- 函数参数的传递问题(指针的指针)【想在函数中分配内存】(指针做参数,即可做输入参数也可做输出参数)
- 学习Python数据分析随手笔记【一】numpy数组的函数简单应用
- C语言指针笔记之 一级指针的应用(指针做函数参数)
- C语言学习10:结构体,结构体应用,联合用法,枚举,fopen函数使用,fseek,ftell的作用和文件结束符EOF,数组和文件交换数据,个人信息管理。
- C++ 常量指针或者常量引用作为函数参数传递的原因
- C++成员函数指针的应用
- 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用
- SQL Servr 2008空间数据应用系列四:基础空间对象与函数应用 推荐
- C++引用实现函数传递数据
- 指针在函数中的应用
- 结构和其他数据形式 向函数传递结构信息
- 函数指针的应用