- 变量的作用域:块作用域、文件作用域、函数原型作用域、函数作用域和类作用域。
for语句表达式1的变量作用域是包含for语句的块,不是循环体;表达式3表示的变量也是循环体外的
for(表达式1;表达式2;表达式3)
循环体
#include<iostream>
using namespace std;
int main() {
//i的作用域在main的这个语句块里
for (int i = 0; i < 2; i++)
//j的作用域在上一行i的循环体里面
for (int j = 0; j < 3; j++)
cout << i + j;
//这里i的作用域可以到达这里
for (int i; i < 4; i++)
//由于j作用域不在这里,所以报错
for (j = 0; j < 5; j++)
cout << i + j;
return 0;
}
- 变量的存储类型:
示例:静态存储类型(初始值为0)
程序运行结束时回收
静态类型变量 static 局部静态类型变量 - 块作用域
- 保留上次的值
全局静态类型变量(默认全局变量为……) - 有static则仅限于源程序使用
- 无static则还可以被其他文件使用
外部类型变量 extern 使用条件: - 全局变量先定义后使用
- 使用其他文件中的全局变量(不用static)
动态存储类型(无初始值)
程序运行退出其作用域时回收
自动类型变量 auto(局部变量默认为……) 块作用域 寄存器类型变量 register 常用的auto变量用来做register,但是否可以归系统决定 #include<iostream> using namespace std; void f(int x) { //先使用后定义全局变量 用extern(其后变量不能初始化) //静态存储变量初始值为0,所以i=0 extern int i; static int j = 20; //i、k都是静态存储变量,都会保留上一次循环留下的数据 //而k是动态存储变量,所以每次都是k=30 int k = 30; i += x; j += x; k += x; cout << i << " " << j << " " << k << endl; } //初始化全局静态变量 int i = 10; int main() { for (int i = 1; i < 3; i++) { f(i); } //::意思是在局部变量作用下用全局变量i cout << i << " " << ::i << endl; return 0; }
- 值传递、引用传递、地址传递
形参形式 实参形式 值传递 变量名 变量名 形参不影响实参 引用传递
&变量名(引用符号) 变量名 实参跟随形参变化 地址传递 *指针名(指针符号) &变量名(变量地址)设*x,*y 实参不变 x=y(只是指针交换了指向的对象,实参不变) 实参变化 *x=*y(把指针y指向的对象内容赋值给了x指向的对象,实参变化)
示例:
#include<iostream>
using namespace std;
int* f(int x1, int &x2, int *x3, int *x4) {
//x1、x2值传递
x1 = x2;
//x2、x3引用传递,这里是x3的解引用,将x3指向的对象内容赋予给x2
x2 = *x3;
//实参不变的地址传递,x3指向x4指向的对象,实参不变
x3 = x4;
//实参变化的地址传递,把x3指向内容的对象赋值给了x4指向的内容
*x4 = *x3;
cout << x1 << " " << x2 << " " << *x3 << " " << *x4 << endl;
return &x2;
}
int main() {
//这是不常用的赋值语句,相当于a=1,b=2……
int a(1), b(2), c(3), d(4);
cout << *(f(a, b, &c, &d)) << endl;
cout << a << " " << b << " " << c << " " << d << endl;
return 0;
}
今天还看了几个程序设计,不过还没有尝试打出来,明天继续!