C++学习笔记day14-----标准C语言

之前的笔记提到过,全局变量是可以让这个程序的其他源文件使用的,但是在使用前需要声明,告知编译器,这个全局变量在其他的源文件中,否则编译器会报错。
extern int num;
一个全局变量可能会被其他多个源文件使用,如果每次都在要使用这个全局变量的源文件中声明是比较不方便的。
由于全局变量的这种声明是不占内存的,所以可以把它放在头文件中,当其他源文件包含这个头文件的时候,就不需要在另外的做声明了。(比如说,我在Demo.c的源文件中,创建了 int num;这个全局变量,就可以把声明extren int num;写在Demo.h中)
静态全局变量的作用域是在声明它的那个源文件内

结构体:
结构体是可以存放多个不同类型的数据类型,甚至可以是另外一个结构体。

声明:
typedef struct People{
char name[20];
int age;
int sex;
}Peo;
声明结构体需要使用关键字struct
People是这个结构体的名称
一对花括号内部的内容称为这个结构体的成员变量
typedef 也是一个关键字,是用于给类型起别名的
Peo就是People类型的别名
由于别名的存在,整个声明可以省略掉类型名称变成以下形式:
typedef struct {
char name[20];
int age;
int sex;
}Peo;
简述一下为什么这么做,如果不适用别名,那么整个结构体的名称,应该是 struct People,这个类型用于声明People类型的变量来说,实在是太长了,所以用别名Peo代替了struct People。
声明结构体的时候,它是不会占用任何内存的,因为它仅仅是个类型!就像int不会占用内存一样。所以是可以把它写在头文件中的,这样其他文件只要包含了头文件,就可以使用这种结构体类型。

初始化:
结构体的初始化和数组非常的相似,当用结构体类型给声明了一个变量之后,可以像以下方式初始化。
Peo Bob={Bob,25,1};
如果在花括号内写了一个0.则表示,全部成员变量初始化为0.

使用:
两个同类型的结构体是可以直接赋值的!
Peo Bob = {0};
Peo Jm = Bob;
可以使用成员运算符表示结构体中的成员变量。
Bob.name 或者 Bob.age
注意,这里的Bob.name就可以当作一个字符数组处理,它表示第一个元素的地址。
而Bob.age就代表了一个int类型的变量!也可以正常的使用。PS: Bob.age = 10;
结构体指针!这是一个非常非常重要的应用。
Peo* p_peo = NULL;
这个样子就是声明了一个Peo类型的指针。
p_peo = &Bob
(*p_peo).name == Bob.name
p_peo -> name == (*p_peo).name
把指针指向一个Peo的变量的时候,上面的三种表示方式是等价的。使用结构体指针的时候,尽量使用 -> 这种方式(我也不知道为什么,看起来最高级)。
结构体类型是可以当作函数的参数,形参和返回值的,但是一定要通过地址的方式去传递。
假设一个结构体作为返回值,被调函数得先把这个返回值存在一个暂存的地方,
如果调用函数要用这个返回值,还得把这个结构体从暂存的地方赋值到调用函数准备好的内存地址中。
两次赋值,一旦结构体足够庞大,就会拖累程序,浪费时间,浪费内存。
如果要使用结构体,一定要使用结构体的地址和结构体的指针用于函数间的参数传递。
这里要介绍两个典型的问题!
1、如果被调函数的形参是一个结构体指针类型,然后背调函数不修改结构体内容,一定要加上const,这个细节很大程度上,能避免对结构体的误操作。
2、如果被调函数的返回值是结构体指针类型或者结构体地址,而这个结构体是被调函数的局部变量,一定要加上static关键字。局部变量的地址即使传出来也没有用,函数结束后,这个局部变量会被释放,然后传出来的这个地址上,到底是什么东西,谁都不知道。所以一定要用static,将其声明问静态局部变量,这样就可以将它的生命周期延长到整个程序结束。即使被调函数结束,计算机也会为这个变量保存这块地址的内容。

最后,建议调用函数尽可能的为被调函数准备好变量,用于存放被调函数的返回值。
比较好的做法就是,在调用函数中创建好用于接受被调函数返回值的变量,然后把这个变量的地址通过实参的方式传递给被调用函数。

数据对齐和数据补齐
typedef struct {
char name;
int age;
int sex;
}Peo;
Peo Bob={0};
按照正常的理解方式,Bob的内存大小应该是 1 + 4 + 4Byte。
实际上不是这样。计算机把内存分为4个Byte一组。
一个变量存放的地址,必须是这个变量类型所占字节大小的整数倍。
比如说,int类型,4Byte,起始位置不能放在1,2,3的位置上。
所以Bob的age变量,和name变量中间是空出了3Byte,整个Bob占用12Byte。
这个叫做数据对齐。
typedef struct {
int age;
int sex;
char name;
}Peo;
Peo Jm = {0};
现在把name挪到后面。Jm的大小还是12btye。
规定,结构体变量的占用内存大小,必须是占内存地址最大的那个基本类型的成员变量的地址的整数倍。
上述结构体中,int最大,4Btye。先按照正常的计算 4 + 4 + 1 = 9 Byte,不是4Byte的整数倍,所以补齐到12Byte。这就是数据补齐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值