11. 结构和变量生存期

11.1 结构

1)在现实问题中,常常需要用一组不同类型的数据来描述一个事物,比如学生的姓名、学号和成绩.
2)如果编程时要用多个不同类型的变量来描述一个事物,就很麻烦,当然希望只用一个变量就能代表一个“学生”这样的事物
3)C++允许程序员自己定义新的数据类型。因此针对学生这种事物,可以定义一种新名为Student的数据类型,一个Student类型的变量就能描述一个学生的全部信息.
4)用关键字"struct"来定义一个"结构",也就定义了一个新的数据类型:

struct	结构名{
	类型名 成员变量名;
	类型名 成员变量名;
	类型名 成员变量名;
	.......
}
**```
5)示例如下:**
```cpp
struct Student{
	unsigned int ID;
	char szName[20];
	float fGPA;
}

6)Student即成为自定义类型的名字,可以用来定义变量

Student s1, s2;

7)两个同类型的结构变量可以相互赋值,但是结构变量之间不能用 ==、!=、<、>、<=、>=进行比较运算
8)一般来说,一个结构变量所占的内存空间的大小,就是结构变量中所有成员变量大小之和.
9)结构变量中的各个成员变量在内存中一般是连续存放的.

在这里插入图片描述
10)一个结构的成员变量可以是任何类型的,包括可以是另一个结构类型:

struct Date{
	int year;
	int month;
	int day;
}
struct StudentEx{
	unsigned int ID;
	char szName[20];
	float fGPA;
	Date birthday;
}

11)结构的成员变量可以是指向本结构类型的变量的指针:

struct Employee{
	string name;
	int age;
	int salary;
	Employee * next;
}

12)访问结构变量的成员变量:
(1)一个结构变量的成员变量,完全可以和一个普通变量一样来使用,也可以取其地址.
(2)使用形式:结构变量名.成员变量名

#include <iostream>
#include <cstring>
using namespace std;
struct Date{
	int year;
	int month;
	int day;
};
struct StudentEx{
	unsigned int ID;
	char szName[20];
	float fGPA;
	Date birthday;
};
int main()
{
    StudentEx stu;
    cin >> stu.fGPA;
    stu.ID = 12345;
    strcpy(stu.szName, "Tom");
    cout << stu.fGPA << endl;
    stu.birthday.year = 1984;
    unsigned int * p = & stu.ID;

}

13)结构变量的初始化:

studentEx stu = {1234,"Tom", 3.45, {1984,12,23}};

14)结构数组和指针

studentEx MyClass2[3]={
				 {1234,"Tom", 3.45, {1984,12,23}
				 {1234,"Tom", 3.45, {1984,12,23}
				 {1234,"Tom", 3.45, {1984,12,23}
};
MyClass[1].ID = 1267;
MyClass[2].birthday.year = 1998;
MyClass[2].birthday.month = 12;
cin >> MyClass[0].szName;

14)指向结构变量的指针
(1)通过指针访问其指向的结构变量的成员变量:指针->成员变量名 或 (*指针).成员变量名
(2)示例:

StudentEx stu;		//定义一个学生变量
StudentEx * pstu;	//定义一个学生变量的指针
pstu = & stu;		//pstu指向stu
pstu->ID = 12345;	//通过->访问stu的成员变量
(*pstu).fGPA = 3.5;	
cout << stu.ID << endl;
cout << pstu->fGPA << endl;

11.2 C++程序结构

1)全局变量:定义在所有函数外面的变量叫全局变量
2)局部变量:定义在函数内部的变量叫局部变量
3)全局变量在所有函数内都可以使用,局部变量值可以在定义它的函数内部使用

#include <iostream>
#include <cstring>
using namespace std;
int n1 = 5, n2 = 10;    //全局变量
void Func1(){
    int n3 = 4;
    n2 = 3;
}
void Func2(){
    int n4 = 4;
    n3 = 5;     //编译出错,n3无定义
}

4)静态变量:
(1)全局变量都是静态变量
(2)局部变量在定义时如果前面加了"static"关键字,那么该变量也是局部变量
(3)静态变量的存放地址,在整个程序运行期间都是不变的
(4)非静态变量(一定是局部变量)地址在每次调用函数时都肯不同,在函数的一次执行期间不变
(5)如果未明确初始化,则静态变量会被自动初始化为0(每个bit都是0),局部非静态变量的值则随机
(6)静态变量示例如下:

#include <iostream>
using namespace std;
void Func(){
    static int n = 4;
    cout << n <<endl;
    n++;
}
int main(){
   Func();
   Func();
   Func();
}
输出:4 5 6

5)静态变量的应用:strtok的实现

char * Strtok(char * p, char * sep){
    static char * start;                            //本次查找子串的起点
    if (p)
        start = p;
    for (; *start && strchr(sep, *start); ++start); //跳过分隔符号
    if ( * start == 0)
        return NULL;
    char * q = start;
    for (; * start && !strchr(sep, *start); ++start);//跳过非分隔符号
    if (* start){
        * start = 0;
        ++start;
    }
    return q;
}

6)变量的生存期
(1)所谓的变量的生存期,指的是在此期间,变量占有内存空间,其占有的内存空间只能归他使用,不会用来存别的东西.
(2)变量的生存期终止,就意味着该变量不在占有内存空间,他原来占有的内存空间,随时可能被派作他用.
(3)全局变量的生存期,从程序装入内存开始到整个程序结束.
(4)静态局部变量的生存期,从定义它的语句第一次被执行开始,到整个程序运行结束.
(5)函数形参的生存期从函数执行开始导函数返回结束。
(6)非静态局部变量的生存期从执行到定义它的语句开始到程序执行到它的作用域之外.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值