结构体的声明
- C语言中结构体是没有构造函数的,而C++中结构体则有构造函数,事实上在C++里根本没有结构,仅仅为了兼容C才有结构这种东西,实际上除了名字以外,C++的结构就是类!!
- C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
- 结构体与类的区别:
- 从空间分配来看,struct变量放在栈上,而class变量放在堆上,因此struct变量会自动释放,而class变量需要手动释放。
- struct默认是public,class默认为private。
- 结构体的声明一般使用以下三种方法,或者使用typedef定义新的数据类型
- 先声明结构体,在定义结构体变量。
- 声明结构体的同时定义结构体变量。
- 直接定义结构体变量或者使用typedef定义一个新的数据类型。
- 先声明结构体,在定义结构体变量
//声明结构体
struct student{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
//定义结构体变量
struct student stu1,stu2;
//此时stu1,stu2为student结构体变量
};
- 声明结构体的同时定义结构体变量。
//声明结构体
struct student{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
}stu1,stu2;
//此时stu1,stu2为student结构体变量
struct student stu3;
//此时还可以继续定义新的结构体变量
- 直接定义结构体变量
//声明结构体
struct{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
}stu1,stu2;
- 使用typedef定义一个新的数据类型。
//声明结构体
typedef struct student{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
}STUDENT;
//定义结构体变量
STUDENT stu;
//这里的struct student就可以等于STUDENT,
//定义新的student类型的变量时,数据类型直接写成STUDENT就可以了。
- 在C++中,引用变量的基本原则是在使用变量前需要对变量进行定义并初始化。
- 引用结构体变量成员,C++提供了三种形式来引用结构体变量的成员:
- 结构体变量名.成员名
- 指针变量名->成员名
- (*指针变量名).成员名
- “ . ”称为成员运算符;“ -> ”称为结构指向运算符。
- 结构体对齐规则:
- 结构体的大小为其内部最大元素类型的整数倍,不足的后面补齐。
- 变量存储起始位置是该变量类型大小的整数倍。
- int数据类型要求对齐4字节的整数倍位置。
- short类型要求从偶数地址开始储存。
- 类型重定义语句:tepedef
typedef 类型名称 类型标识符
//如:
typedef int m_int;
//typedef语句并没有引入新的数据类型,而是重新为一个已有的数据类型命名
- 指定初始化:
//已知一个结构体,定义如下
struct student
{
uint id;
char *sex;
char *name;
};
//C99支持结构的指定初始化项目,
//其语法与数组的指定初始化项目近似。
//只是,结构的指定初始化项目使用点运算符和成员名来标识具体的元素。
struct student stu2=
{
.id = 11,
.sex = "g"
};