一个例子
参考:http://blog.csdn.net/sszgg2006/article/details/9037675
#include<iostream>
using namespace std;
int m_value = 1;
void func(int *p)
{
p = &m_value;
}
int main(int argc, char *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn << endl;
return 0;
}
运行结果:
2
2
修改func函数如下
void func(int *p)
{
/*p = &m_value;*/
*p = 3;
}
运行结果:
2
3
修改func函数如下:
void func(int *p)
{
/p = &m_value;/
//*p = 3;
int a = 3;
*p =a;
}
依然是2,3
修改func函数如下:
void func(int *p)
{
/*p = &m_value;*/
//*p = 3;
int a = 3;
p =&a;
}
结果是2,2
解释:
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。
如果函数体内的程序修改了_p所指向的内容,就导致参数p的内容作相应的修改。把_p所指的内存地址改变了,那么 _p指向的内存块,和p指向的内存块就不一样了。所以对p毫无影响。只要程序里不改变 _p的指向, _p和p就是一样的,操作 _p内容,就是操作p的内容。
下面常用的交换程序:
#include <stdio.h>
int *swap(int *px, int *py){
int temp;
temp = *px;
*px = *py;
*py = temp;
return px;
}
int main(void){