C语言第二十一讲

课堂笔记

蓝色字为自己的笔记补充

#include <iostream>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

void h()

{

        extern int ga;  //外部变量,借用

        cout<<"地址:"<<&ga<<"\t值:ga="<<ga<<endl; 

}

//变量的生成存期 与作用域

//作用域:

//全局作用域:生存期为到以下所有东西运行完为止

// 局部作用域:局部变量 不会延伸到下面的函数

//局部变量:

//初始值:没有默认值

//存储区域:栈区 (动态存储区(用完了要归还))

int ga;  //全局变量,在所有函数之外声明的变量。

            //初始值: 默认是0模式,字符型中的0模式(ASCII码值为0,NULL,\0,空字符)

                         //存储区域:数据区(静态存储区)

double 8字节        int 4字节

若地址为:0x22fe30                      0x22fe3c

                 3031、…37           3c3d3e3f

要调用f才能看到结果

void g(int x,int y);//x,y属于局部变量,作用域只是当前的语句

                          

void f()

{

        int fa=2;

       

        cout<<"地址:"<<&fa<<"\t值:fa="<<fa<<endl;

}

int main(int argc, char** argv) {

        int ma=10;

        double mb=2.3;

        cout<<"地址:"<<&ma<<"\t值:ma="<<ma<<endl;

        cout<<"地址:"<<&mb<<"\t值:mb="<<mb<<endl;

        //cout<<fa<<endl;

        cout<<"地址:"<<&ga<<"\t值:ga="<<ga<<endl;

        f();

        {

                 int mc=30;  //局部作用域:块作用域,到当前块结束

                 cout<<"地址:"<<&mc<<"\t值:mc="<<mc<<endl;

        }

        //cout<<"地址:"<<&mc<<"\t值:mc="<<mc<<endl;

        //int i,j;

        for(int i=0;i<10;i++)

        {

                 for(int j=0;j<10;j++) 如此声明变成局部作用域

                 {

                         cout<<i<<"\t"<<j<<"\t";

                 } j的作用域结束

                 cout<<endl;

                 //cout<<j<<endl;

        } i的作用域结束

        如果在此(括号外)调用/访问/输出  会变成未声明X

        //cout<<"地址:"<<&i<<"\t值:i="<<i<<endl;

        //cout<<"地址:"<<&j<<"\t值:j="<<j<<endl;

       

        int ga=40;//在函数内声明一个与全局变量同名变量后,局部变量会隐藏全局变量 

  • ga为全局变量,那么它不能在它前面的局部变量使用,但可以使用extern 也就是外部变量(借用)但是只能在同一个头文件内(也就是同一个文件)借用
  • 在主函数内也要再次声明同名ga

        cout<<"地址:"<<&ga<<"\t值:ga="<<ga<<endl;

        cout<<"地址:"<<&::ga<<"\t值:ga="<<::ga<<endl;//::是在被隐藏后,想访问全局变量的运算符  两个冒号

        return 0;

}

void g(int a,int b)  //形参的作用域是当前的函数体

main的右括号后,作为形参,作用域是当前函数体(也就是void{}内)

{}为局部作用域、局部声明、到 右括号 结束

                                                           当前块

{

       

}

#include <iostream>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//变量的生存期

//变量的存储类型

//(1)自动变量

//(2)静态变量

//(3)外部变量

//(4)寄存器变量

void f()

{

        auto int fa=0;//auto  自动变量,不加其他 限制符的时候,变量都是auto型的 也就是一般会省略不写

        static int fb=0; //static 静态变量 ,fb静态局部变量 分配到数据区

        //自动变量的生存期是当次函数的调用,声明开始,到作用域结束

        //静态局部变量的生存期是从第一次函数的调用的声明开始,到程序的结束

        //只在第一次运行时在数据区分配空间并初始化,空间不会被释放,以后再调用该函数时,只是用原来的那一份

}”标志函数的结束,会释放栈区所用到的所有空间,但数据区的不会

fa会被重新分配空间,初始值为原来的0

fb会调用原来的数据区(未释放的空间),初始值为未释放的空间里的值1

综上,自动变量的生存期是当次函数的调用,声明开始,到作用域结束;静态局部变量的生存期是从第一次函数的调用的声明开始,到程序的结束

register 寄存器

        fa++;

        fb++;

        cout<<"fa="<<fa<<"\tfb="<<fb<<endl;

}

int main(int argc, char** argv) {

        f();

        f();

        f();

        register int a;

       

        return 0;

}

//函数调用过程:

//main   :先记录返回地址

//       :给参数分配空间argc,argv   栈区

//       :参数传递

// f():  记录返回地址

//        :fa在栈区分配空间, 一般的编辑环境是无默认值

//        :fa=0 ,1

//        :fb在数据区分配空间,默认值为0模式。   数据区fb=0 ,1,2

//        :}函数的结束,会释放栈区所用到的所有空间.数据区的不会

// f()   :记录返回地址

//       : :fa在栈区分配空间,

//        :fa=0;  1

//       :}函数的结束,会释放栈区所用到的所有空间.数据区的不会

//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值