我对C++变量的认识

先看一段程序

#include <iostream>
using namespace std;
void fn(int *ptr) 
{ 
    static int i=1; 
    ptr = &i; 
} 
void fn2(int **ptr) 
{ 
    static int j=1; 
    *ptr = &j; 
} 
int main() 
{ 
    int num=0; 
    int *p = &num; 
    
    fn(p); 
    cout<<*p<<endl;
    cout<<"-------------"<<endl;
    fn2(&p); 
     cout<<*p<<endl;
} 

两个函数fn和fn2,然后两个变量num与*p,执行函数输出结果。

凡是涉及C++的变量我们要把它当做一个整体来看待,这个整体中包含四项内容分别是:变量的名称、变量的类型、变量的值和变量的地址。任何一个C++变量都包含这四部分内容。

 现在我们使用这个变量模型来分析这个程序。首先num变量就变为了:

随后是指针变量*p:

 

指针变量的值是地址,更具体的说是num变量的地址,所以p的值是abcdef。

接下来就是调用函数fn。函数fn有一个形参是指针变量ptr。函数调用发生时,实参会进行传值,所以局部变量ptr就是

 函数调用发生时,实参p传值给了形参ptr,所以形参ptr的值就是实参p的值。随后,fn函数进行了一次赋值操作。将一个静态局部变量i的地址值赋值给了指针变量ptr,赋值后的ptr就是:

 现在局部指针变量ptr的值变为了静态局部变量i的地址。

随后,fn执行完毕,局部变量ptr被销毁。执行器回到main函数,利用cout输出解引用表达式的值。

解引用运算符(*)只能应用于指针变量,构成解引用表达式。表达式的结果是指针变量值所引用的变量的值。

根据指针变量p的值(abcdef)找到对应地址变量的过程其实就是所谓的引用(reference),解引用表达式的结果就是引用变量的值,也就是num变量的值0。

所以屏幕上输出0。

随后是输出华丽的分割线。

接下来是fn2函数的调用。fn2同样有一个形参ptr变量,它是指针的指针变量。函数调用时,会进行实参的传值,此时fn2的局部变量ptr就是:

 局部变量ptr的值就是p的地址ffaabb。

fn2函数随后又开始了一次赋值操作。赋值符号右侧依然是一个静态局部变量j的地址。而解引用发生在赋值符号左侧时,就是要修改指针引用变量的值。所以操作的结果就是:

所以,fn2中的赋值语句,真正受影响的是指针变量p。因为指针变量p是被ptr引用的变量,通过解引用运算符,变量p的值被修改为了静态局部变量j的地址ac092b。

随后fn2函数执行完毕,局部变量ptr被回收。

再次输出对指针变量解引用的结果。现在静态局部变量j才是被p引用的变量,所以输出的是变量j的值1。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值