函数传递值和址的区别

#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

由此可知:

  1. 指针只能改变其指向的内存单元
  2. 指针作为参数本质也是copy,创建一个新的临时变量,把它肚子的东西copy了一份;所以传递一级指针到函数怎么玩也改变不了p,操作的只是备份。除非它被指向,也就是传入2级指针。

总结:一级指针只能改变值,二级指针能改变所有(值和指针指向)。

results matching ""

    No results matching ""