谭浩强C++课件_2 作用域 存储类 数组 结构体

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文件file2.c中的内容为:
外部全局 变量说明 extern int a; int power (int n ) { int i, y=1;
c=a*b;
d= power(m);
引用文件外定 义的全局变量
for (i=1; i<=n; i++) y*=a; return y;
cout<<a<<“*”<<b<<“=“<<c<<endl;
.....
}
x,y,i,j 有效
3
主函数main中定义的变量,也只在主函数中有效, 同样属于局部变量。 不同的函数可以使用相同名字的局部变量,它们在 内存中分属不同的存储区间,互不干扰。 void main(void)
{ int x=10; { int x=20; cout<<x<<endl; } cout<<x<<endl; } 10
22
4
9
18
全局变量的存储方式(extern
static)
全局变量是在函数的外部定义的,编译时分配在静态存储 区,如果未赋初值,其值为0。 1、extern 存储类别 全局变量的默认方式,当在一个文件中要引用另一个文件 中的全局变量或在全局变量定义之前要引用它时,可用 extern作说明,相当于扩大全局变量的作用域。 2、静态(static)存储类别
函数原型作用域 在函数原型的参数表中说明的标识符所具有的作 用域称为函数原型作用域,它从其说明处开始, 到函数原型说明的结束处结束。
float tt(int x , float y); //函数tt的原型说明
由于所说明的标识符与该函数的定义及调用无关,
所以,可以在函数原型说明中只作参数的类型说
明,而省略参量名。
பைடு நூலகம்
存放程 序代码
存放变量
需要区分变量的存储类型
16
全局变量 作用域 生存期
动态存储变量
局部变量
静态存储变量
静态存储:在文件运行期间有固定的存储空间,直到文件 运行结束。 动态存储:在程序运行期间根据需要分配存储空间,函数 结束后立即释放空间。若一个函数在程序中被调用两次, 则每次分配的单元有可能不同。 程序区 静态存储区 动态存储区
全局变量
静态局部变量
17 动态局部变量
动态变量(auto):默认,存储在动态区
局部变量 的分类
寄存器变量(register):在cpu内部存储
静态局部变量(static):存储在静态区
动态局部变量未被赋值时,其值为随机值。其作用域的函 数或复合语句结束时,空间被程序收回。
程序执行到静态局部变量时,为其在静态区开辟存储空间, 该空间一直被保留,直到程序运行结束。
b
4 c
The max is 4
The min is 1
10
在同一个源文件中,外部变量与局部变量同名,则在局部 变量的作用范围内,外部变量不起作用。 int a=3, b=5;
int max(int a, int b) { int c;
a 3 a 8 b 5
c=a>b? a:b;
return c;
float tt (int , float);
14
int i=0; int workover(int i) { i=(i%i)*((i*i)/(2*i)+4); cout<<“i=“<<i<<endl;
void main(void)
{ int i=5;
rest(i/2);
cout<<“i=“<<i<<endl; rest(i=i/2); cout<<“i=“<<i<<endl; i= rest(i/2);
}
cout<<p<<endl;
21
int q(int x)
{ int y=1;
static int z=1;
z+=z+y++;
return x+z;
} void main(void) { cout<<q(1)<<„\t‟; cout<<q(2)<<„\t‟; cout<<q(3)<<„\t‟; }
c+=++b; { int b=4, c;
c=b*3;
a+=c;
a=2 b=3, c=6 b=4 c=12
a=14
cout<<“first:”<<a<<„\t‟<<b<<„\t‟<<c<<endl; a=14,b=4,c=12 a+=c; a=26 a=26,b=4,c=12 cout<<“second:”<<a<<„\t‟<<b<<„\t‟<<c<<endl; } cout<<“third:”<<a<<„\t‟<<b<<„\t‟<<c<<endl; } a=26,b=3,c=6
7
文件作用域 在函数外定义的变量称为全局变量。 全局变量的作用域称为文件作用域,即在整个文 件中都是可以访问的。 其缺省的作用范围是:从定义全局变量的位置开始 到该源程序文件结束。 当在块作用域内的变量与全局变量同名时,局部 变量优先。
8
int p=1, q=5; float f1( int a)
func( 4, 1) a=4, b=1 m=0, i=2 i=3
func( 4, 1) a=4, b=1 m=8, i=3 i=3+8+1=12
m=3+4+1=8
输出:8,17 cout<<p<<endl;
m=12+4+1=17
{ int k=4, m=1, p;
p=func(k, m);
p=func(k, m);
它仅能在本文件中引用,即使在其它文件中用extern说明 也不能使用。相当于限制了全局变量的作用域范围。
23
程序的作用是:给定b的值,输入a和m,求a×b和am的值。
文件file1.c中的内容为: 外部全局 int a; 变量定义 void main(void) { extern int power (int); int b=3, c, d, m; cin>>a>>m;
输出: 125
输出: 5
12
在块作用域内可通过作用域运算符“::”来引用与局部 变量同名的全局变量。 #include <iostream.h> ::i=104 int i= 100; void main(void) i=18 { j=108 int i , j=50; i=18; //访问局部变量i ::i= ::i+4; //访问全部变量i j= ::i+i; //访问全部变量i和局部变量j cout<<”::i=”<<::i<<‟\n‟; cout<<”i=”<<i<<‟\n‟; cout<<”j=”<<j<<‟\n‟; 13 }
{ int a, b=2;
a=b+c;
cout<<a<<„\t‟<<b<<„\t‟<<c<<endl; }
2 c=a-b; 7 cout<<a<<„\t‟<<b<<„\t‟<<c<<endl; 2 }
3 2 3
5 5 -1
6
void main(void) { int a=1,b=2,c=3;
++a;
return i;
}
int rest (int i)
{ i=i<2?5:0; return i; }
i=5 i=2 i=5 i=0 i=5 }
cout<<“i=“<<i<<endl;
workover(i)
cout<<“i=“<<i<<endl;
15
存储类
外存 程序 内存
程 序 区
静态存储区 动态存储区
int f (int a) { int b=0; static int c=3; b=b+1; c=c+1; return a+b+c; }
只赋一 次初值
i=0
a=2 b=0, b=1 输出:7 c=3, c=4
i=1
a=2 b=0, b=1 输出:8 c=4, c=5 a=2 b=0, b=1 输出:9 c=5, c=6
外部 extern
全局变量 局部变量
自动
寄存器
auto
register
静态 static
静态
static
25
内联函数
主调函数
被调函数
调用处
主调函数
内联函数 被调函数
调用处
将被调函数体的代
码直接插到调用处
26
内联函数的实质是用存储空间(使用更 多的存储空间)来换取时间(减少执行时
间).
内联函数的定义方法是,在函数定义时, 在函数的类型前增加修饰词inline。
4
10 定义变量既是在 x
内存中开辟区间
20 x
20
注意:
具有块作用域的标识符在其作用域内,将屏 蔽其作用块包含本块的同名标识符,即
变量名相同,局部更优先。
5
void main(void) { int a=2, b=3, c=5;
2 a 7 a
3 b 2 b
-1 5
c
cout<<a<<„\t‟<<b<<„\t‟<<c<<endl;
cout<<a<<“**”<<m<<“=“<<d<<endl;
}
}
24
静态局部变量:static 在函数内部定义,存储在静态存储 区,与auto对应,在别的函数中不能引用。 全局静态变量:static 在函数外部定义,只限在本文件中 使用,与extern对应。 当变量名相同致使作用域相重时,起作用的是最近说明的 那个变量。
27
inline int max (int x, int y) { int z;
z=(x>y)? x : y ;
return z;
}
void main (void ) { int a,b,c; cin>>a>>b; c=max (a+b , a*b) ; cout<<“The max is”<<c<<endl; }
i=2 7 8 9
void main(void) { int a=2,i; for (i=0;i<3;i++) cout<<f(a)<<endl; }
20
int func (int a, int b)
{ static int m=0, i=2; i+=m+1; m=i+a+b; return m; } void main(void)
max (8,5)
}
void main(void) { int a=8; cout<<max(a,b)<<endl; }
8 5
a
b
11
输出:8
int x;
void cude(void) { x=x*x*x ; x为0
} void main (void) { int x=5; x=5; cude ( ); cout<<x<<endl; }
2
在函数内或复合语句内部定义的变量,其作用域是 从定义的位置起到函数体或复合语句的结束。形参 也是局部变量。
float f1( int a) void main(void ) a,b,c有效
{ int b,c;
..... }
{ int m, n;
..... } m,n有效
float f2( int x, int y) { int i, j;
全局变量 a,b,c有效 p,q有效
{ int b,c;
..... } char c1,c2; main( ) 局部变量
{ int m, n;
..... }
m,n有效
c1,c2有效
全局变量增加了函数间数据联系的渠道,在函数调 用时可以得到多于一个的返回值。 9
int min; 全局变量 0 1 int max (int x, int y) min { int z; min=(x<y)?x : y; min 在main( )和max( )中均有效, 1 4 4 z=(x>y)? x : y ; 在内存中有唯一的存储空间。 x y z return z; 函数值为4 } void main (void) 1 { int a,b,c; a cin>>a>>b; c=max (a , b) ; cout<<“The max is”<<c<<endl; cout<<“ The min is”<<min<<endl; } 4
由于存储在静态区,静态局部变量或全局变量未赋初值时, 系统自动使之为0。 18
int fun(int a) 只赋一次初值 { int c; static int b=3; c=a+ b++; 2 5 3 4 5 5 9 return c; a a b c c } 输出: void main(void) { int x=2, y; 5 2 5 9 y=fun(x); 9 x y cout<<y<<endl; 变量b是静态局部变量,在内存 y=fun(x+3); 一旦开辟空间,就不会释放,空 cout<<y<<endl; 间值一直保留 19 }
作用域和存储类 作用域是指程序中所说明的标识符在哪一个区间 内有效,即在哪一个区间内可以使用或引用该标 识符。在C++中,作用域共分为五类:块作用域、 文件作用域、函数原型作用域、函数作用域和类 的作用域。
1
块作用域
我们把用花括号括起来的一部分程序称为一个块。 在块内说明的标识符,只能在该块内引用,即其 作用域在该块内,开始于标识符的说明处,结束 于块的结尾处。 在一个函数内部定义的变量或在一个块中定义的 变量称为局部变量。
相关文档
最新文档