第十周(笔记)
10.1 结构(struct)
- 结构的定义
- 用"struct" 关键字来定义一个"结构" ,也就定义了一个新的数据类型:
- Student即成为自定义类型的名字,可以用来定义变量,例如Student s,s1;
- 两个同类型的结构变量,可以互相赋值,但结构变量之间不能用“==”、“!=”、“<”、“>”、“<=”、“>=”进行比较运算(等以后学习面向对象的时候就可以比较了)
- 一般来说,一个结构变量所占的内存空间的大小,就是结构中所有成员变量大小之和。结构变量中的各个成员变量在内存中一般是连续存放的。以上例来说,id占4个字节,szName占20个字节,一共24个字节
struct Student(结构名) {
unsigned(类型名) ID(成员变量名);
float szName[20];
...
};
- 结构中的结构
struct Date {
int year;
int month;
int day;
};
struct StudentEx {
unsigned ID;
char szName[20];
float fGPA;
Date birthday;
};
- 指向本结构类型的变量的指针
struct Employee {
string name;
int age;
int salary;
Employee * next;
};
- 访问结构变量的成员变量
- 一个结构变量的成员变量,可以完全和一个普通变量一样来使用,也可以取得其地址。使用形式:结构变量名 . 成员变量名
StudentEx stu;
cin >> stu.fGPA;
stu.ID = 12345;
strcpy(stu.szName,"Tom");
cout << stu.fGPA;
stu.birthday.year = 1984;
unsigned int * p = & stu.ID;
- 结构变量的初始化
- 结构变量可以在定义时进行初始化;比如StudentEx stu = {1234,“tom”,3.78,{1984,12,28}}:
- 结构数组
StudentEx MyClass[50];
StudentEx MyClass2[50] = {{1234,"tom",3.78,{1984,12,28}},
{1235,"jack",3.78,{1934,2,8}},
...
};
MyClass[1].ID = 1267;
MyClass[2].birthday.year = 1986;
int n = MyClass[2].birthday.month;
cin >> MyClass[0].szName;
- 指向结构变量的指针
StudentEx * pStudent;
StudentEx Stu1;
pStudent = & Stu1;
StudentEx Stu2 = * pStudent;
- 通过指针,访问其指向结构变量的成员变量
- 指针->成员变量名或者==( * 指针).成员变量名==
StudentEx Stu;
StudentEx * pStu;
pStu = & stu;
pStu->ID = 12345;
(*pStu).fGPA = 3.48;
cout << Stu.ID << endl;
cout << Stu.fGPA << endl;
10.2 全局变量、局部变量、静态变量
- 全局变量和局部变量
- 定义在函数内部的变量叫局部变量(函数的形参也是局部变量)
- 定义在所有函数的外面的变量叫全局变量
- 全局变量在所有函数中均可以使用,局部变量只能在定义它的函数内部使用
- 静态变量
- 全局变量都是静态变量。局部变量定义时如果前面加了“static"关键字,则该变量也成为静态变量
- 静态变量的存放地址,在整个程序运行期间,都是固定不变的,非静态变量(一定是局部变量)地址每次函数调用时都可能不同,在函数的一次执行期间不变
- 如果未明确初始化,则静态变量会被自动初始化成全0(每个bit都是0),局部非静态的值则随机
#include <iostream>
using namespace std;
void func() {
static int n = 4;
cout << n << endl;
n++;
}
int main()
{
func();func();func();
return 0;
}
10.3 变量的作用域和生存期
- 标识符的作用域
- 变量名、函数名、类型名统称为”标识符“。一个标识符能够起作用的范围叫做该标识符的作用域
- 在一个标识符的作用域之外使用该标识符,会导致"标识符没有定义"的编译错误。使用标识符语句,必须出现在他们的声明或定义之后
- 在单文件的程序中,结构、函数和全局变量的作用域是其定义所在的整个文件
- 函数形参的作用域是整个函数
- 局部变量的作用域,是从定义它的语句开始,到包含他的最内层的那一对大括号”{}“的右大括号”}“为止
- for循环里定义的循环控制变量,其作用域就是整个for循环
- 同名标识符的作用域,可能一个被另一个包含。则在小的作用域里,作用域大的那个标识符被屏蔽,不起作用
- 变量的生存期
- 所谓变量的”生存期“,指的是在此期间,变量占有内存空间,其占有的内存空间只能归它使用,不会被用来存放别的东西,而变量生存期终止,就意味着该变量不在占有内存空间,他原来占有的内存空间,随时可能被派作他用。
- 全局变量的生存期,从程序被装入内存开始到整个程序结束。
- 静态局部变量的生存期,从定义它语句第一次被执行开始,到整个程序结束位置
- 函数形参的生存期从函数执行开始,到函数返回结束。非静态局部变量的生存期,从执行到定义它的语句开始,一旦程序执行到了它的作用域之外,其生存期即终止。
|