课堂笔记
蓝色字为自己的笔记补充
#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
占30、31、…37 占3c、3d、3e、3f
要调用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
// :}函数的结束,会释放栈区所用到的所有空间.数据区的不会
//