函数传递值和址的区别
#include <iostream>
using namespace std;
int a=100, b=10; //全局数据区
int *p;//全局数据区
void func1(int *p){
p = &a;
cout<<"func1 p:"<<p<<endl;
cout<<"func1 &p:"<<&p<<endl;
}
void func2(int **p){
*p = &b;
cout<<"func2 p:"<<p<<endl;
cout<<"func2 &p:"<<&p<<endl;
cout<<"func2 *p:"<<*p<<endl;
}
int main(int argc, char const *argv[])
{
p = &a;
cout<<"p:"<<p<<endl;
cout<<"&p:"<<&p<<endl;
cout<<"&b:"<<&b<<endl;
func1(p); //栈区
cout<<"p:"<<p<<endl;
cout<<"&p:"<<&p<<endl;
func2(&p);//栈区
cout<<"p:"<<p<<endl;
cout<<"&p:"<<&p<<endl;
return 0;
}
p:0x10e3350b8
&p:0x10e3350c0
&b:0x10e3350bc
func1 p:0x10e3350b8
func1 &p:0x7fff518cc5c8
p:0x10e3350b8
&p:0x10e3350c0
func2 p:0x10e3350c0
func2 &p:0x7fff518cc5b8
func2 *p:0x10e3350bc
p:0x10e3350bc
&p:0x10e3350c0
由此可知:
- 指针只能改变其指向的内存单元
- 指针作为参数本质也是copy,创建一个新的临时变量,把它肚子的东西copy了一份;所以传递一级指针到函数怎么玩也改变不了p,操作的只是备份。除非它被指向,也就是传入2级指针。
总结:一级指针只能改变值,二级指针能改变所有(值和指针指向)。