我对C++变量的认识
Posted 哦...
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我对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 = #
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。
以上是关于我对C++变量的认识的主要内容,如果未能解决你的问题,请参考以下文章