C++对于变量的生存周期以及参数传递模式的不解

C++对于变量的生存周期以及参数传递方式的不解
C/C++ code

#include <iostream>
using namespace std;
int x;
void funA(int &,int );
void funB(int ,int &);
void main()
{
    int first;
    int second=5;
     x=6;//初始化全局变量
     //int x=6;//重新定义变量x
    funA(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;
    funB(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;//只初始化全局变量x的值为什么不按照引用或者指针的方式传递,也能改变x在函数外面的值。
    //cout<<first<<" "<<second<<" "<<x<<endl;//如果重新定义变量x,x值没有被改变。这是为什么?
}
/*void main()//第二种方式
{
    int first;
    int second=5;
    x=6;//初始化全局变量
    funA(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;
    {
        int x=9;
        funB(first,second);
        cout<<first<<" "<<second<<" "<<x<<endl;//这里既然x值为9
    }
    cout<<x<<endl;//那么这里为什么x值又变成20了?
}*/
void funA(int &a,int b)
{
    int first;
    first=b+12;
    a=2*b;
    b=first+4;
}
void funB(int u,int &v)
{
    int second;
    second=x;
    v=second+4;
    x=u+v;//x的值被改变。
}




------解决方案--------------------
//只初始化全局变量x的值为什么不按照引用或者指针的方式传递,也能改变x在函数外面的值。
你这是全局变量啊,到哪都改变,main函数和其他函数都可以改变


//int x=6;//重新定义变量x
你这里是定义另外一个局部变量,这不叫重新定义
在main函数中打印出来的是这个局部变量的值,而不是定义的全局变量的那个"x"


------解决方案--------------------
如果局部跟全局变量名一样就先选择局部变量,如果没有改变量就选择全局,
------解决方案--------------------
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

《C++反汇编与逆向分析技术揭秘》
------解决方案--------------------
一看就知道是个新的不能再新的新手
引用和指针当成操作一块已经分配好的内存,可以来改变这块内存的值
传值是分配一块新的内存,使用复制构造函数将旧值复制到新值中

生命周期就更好判断了
指针:内存被释放结束
变量:跟区域有关
临时变量:看大括号
类成员变量:看类成员对象的生命周期
姑且就这么认为吧,描述不清楚望见谅,大致可以这么认为,当发现更好的可替代
------解决方案--------------------
C/C++ code

#include <iostream>
using namespace std;
int x;
void funA(int &,int );
void funB(int ,int &);
void main()
{
    int first;
    int second=5;
     x=6;//初始化全局变量
     //int x=6;//重新定义变量x
    funA(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;
    funB(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;//之所以能修改是因为X作用域为全局。使用指针或者引用的目的就是为了延长某些局部变量的作用域(暂且这么理解).
    //cout<<first<<" "<<second<<" "<<x<<endl;//局部同名变量会屏蔽掉全局同名变量。
}
/*void main()//第二种方式
{
    int first;
    int second=5;
    x=6;//初始化全局变量
    funA(first,second);
    cout<<first<<" "<<second<<" "<<x<<endl;
    {
        int x=9;//这里的x作用域仅限于此{},由于funB并未做x的值传递,故此{}中输出x为9
        funB(first,second);
        cout<<first<<" "<<second<<" "<<x<<endl;//这里的X是属于本段的x 即9.
    }//到此,上面定义的 int x=9;作用域已消失。
    cout<<x<<endl;//这里x为全局定义x,在funB中进行了修改为20.
}*/
void funA(int &a,int b)
{
    int first;
    first=b+12;
    a=2*b;
    b=first+4;
}
void funB(int u,int &v)
{
    int second;
    second=x;
    v=second+4;
    x=u+v;//由于funB并未有x的值传递,故此中x为全局的x
}