c/c++向函数传递指针并修改其指向的问题
来源:互联网 发布:ebay销售数据采集 编辑:程序博客网 时间:2024/06/06 07:48
一个用来交换两个数的值的函数,众所周知的错误写法为:
#include <iostream>using namespace std;void swap(int a, int b){ int t = a; a = b; b = t;}int main(){ int a, b; cin >> a >> b; swap(a, b); cout<< a << " "<< b;}
因为向函数中传递的只是a和b的拷贝,在函数执行结束后其中的a和b的值会被释放,并不会影响调用者中a和b原有的值(即值传递的方法)。
一种正确的写法为:
#include <iostream>using namespace std;void swap(int *p1, int *p2){ int p; p = *p1; *p1 = *p2; *p2 = p; }int main(){ int a, b; int *p, *q; cin >> a >> b; p = &a; q = &b; swap(p, q); cout<< a << " "<< b;}
这里由于使用了指针传递,具体过程为:
函数执行前:
函数执行后:
可以看到,该种方法向函数传递了指向a和b的两个指针,通过直接改变值a和b所在地址中的值的方法达到了交换值的目的。 但该种方法并未改变指针的指向。
而如果想要通过改变指针指向的方法来达到交换值的目的,一种想法是把swap函数修改为:
void swap(int *p1, int *p2){ int *p; p = p1; p1 = p2; p2 = p;}
方法看似很正确,但是很遗憾,执行完swap函数后a和b的值其实并没有更改。 这是因为swap函数在接受两个指针作为参数时,会为两个指针p q创建一份形参拷贝即p1 q1。
函数执行前:
函数执行后:
可以看到,swap函数只改变了两个形参的指向,并未对调用者的指针p q造成影响,这与第一种值传递的方法其实是一样的,只不过这里改变的是指针的值(即指针内存储的地址的值)。
而如果想要在函数内修改指针的指向,并同时影响到调用者的指针,应该向函数传递二级指针(指针的指针):
#include <iostream>using namespace std;void swap(int **p1, int **p2){ int *p; p = *p1; *p1 = *p2; *p2 = p;}int main(){ int a, b; int *p, *q; cin >> a >> b; p = &a; q = &b; swap(&p, &q); cout<< *p << " "<< *q;}
这里向函数传递了p q两个指针的地址, swap函数用两个二级指针形参p1 p2来接收。
函数执行前:
函数执行后:
在该函数中,进行交换的为*p1和*p2,即p和q中的值,也就是a和b两个整数的地址。达到了修改指针的指向从而交换值的目的。
例子非常简单易懂,但值得反思的是,在使用指针时一定要小心谨慎。尤其是不能被平时使用指针的思维惯性影响,以为向函数传了指针,在函数内进行修改时,调用者的值就一定会被修改,要真正理解传递进函数的形参是谁,修改的值又是谁。
1 0
- c/c++向函数传递指针并修改其指向的问题
- 针对上一篇指针问题详细说明(c++向函数传递指针并修改其指向的问题)
- C指针传递,指向指针的指针。
- c 指向函数的指针
- C指向函数指针的函数指针
- C函数的指针传递问题
- C语言指针---指向函数的指针
- C 指针指向调用函数内部的零时变量问题
- C 函数值传递和指针传递的效率问题
- 指向函数的指针(摘自C++Primer
- C primer plus:指向函数的指针
- C语言 指向函数的指针
- 指向函数的指针 - C语言
- 11.13 C语言----指向函数的指针
- C语言指向函数的指针
- C语言指向函数的指针
- C语言 指向函数的指针
- C语言指向函数的指针
- CodeForces #589 B Layer Cake 类似01背包的模拟题
- 完全解决MyEclipse运行中可能存在的乱码问题
- Python调用R语言
- IOS 获取系统信息
- Caffe学习4-利用caffe.proto自定义自己的网络
- c/c++向函数传递指针并修改其指向的问题
- Linux学习之环境变量
- erase()函数操作
- Android 笔记
- 罗马数字转换
- 第八章案例分析
- C++库常用函数一览 :<string> <cctype> <algorithm> <cmath> <cstdlib> <iomanip> <numeric>
- 命令模式
- AtomicBoolean 介绍和使用