1.结构体概述与声明
概述:
结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型
结构体可以容纳需要的任意多数据项
声明:
结构体类型声明形成了创建结构体变量的模板,声明模板时若没有定义变量是没有开辟内存空间的
结构体中的变量称为结构体元素或结构体成员
2.定义结构体变量
一旦声明了结构体,就可以定义一个或多个该类型的变量
示例:struct cat books1;
这条语句将会预留足够的内存来存放该结构体中的所有项
struct cat {
char bk_name[25];
char author[20];
int edn;
float price; } books1, books2;
3.初始化结构体变量
与变量和数组一样,结构体变量也可以在声明时初始化
struct employee
{
int no;
char name [20];
}stu={123,"abc"};
struct employee
{
int no;
char name [20];
}stu={123}; //name值?
employee 类型的变量 emp1 和 emp2 可以按照下面的方式进行声明和初始化:
struct employee emp1 = {346, "Abraham"};
struct employee emp2 = {347, "John"};
4.访问结构体元素
结构体元素通过使用点运算符(.)来引用,这个运算符也称为成员运算符
语法: structure_name.element_name
其中 structure_name 为结构体变量名称,
element_name为元素名称。
示例: printf("%s", books1.bk_name);
5.sizeof()运算符
一个结构体变量所占用内存空间的字节数可以用sizeof运算符求出
sizeof运算符是求字节运算符,用于计算运算对象在内存中所占字节的多少
sizeof运算符是一元运算符,结合方向从右到左
使用sizeof运算可以提高程序移植性
使用方式: sizeof(类型标识符) sizeof(表达式)
例如:
int a[10]; //sizeof(a)表示数组a在内存中所占的字节数
int num; //sizeof(num)表示变量num在内存中所占的字节数
//sizeof(int)表示整型在内存中所占的字节数
//sizeof(struct cat)表示结构体在内存中所占的字节数
6.结构体赋值
可以使用一条简单的赋值语句将一个结构体变量的值赋给另一个相同类型的结构体变量
例如,如果 books1 和 books2 是同一类型的结构体变量,那么下列语句是有效的:
stu_info=stu
也可以通过memcp()函数进行拷贝赋值,该函数用于复制某内存段的值到另一内存段里
memcpy(&stu_msg,&stu,sizeof(STU_T));
7.结构体数组
结构体的一种常见用法是采用结构体数组的形式
首先定义结构体,然后声明该类型的数据变量
示例:
struct cat books[50];
每个数组元素都是一个结构体类型的数据
访问数组 books 的第五个元素中的变量 author:
books[4].author
8.typedef关键字
可以使用 typedef 关键字来定义新的数据类型名
它并没有新建数据类型,而只是为已有的类型定义新的名字
语法:
typedef type name;
9.预处理
概念: C语言允许在程序中使用几种特殊的命令(它们不是一般的C语句),在C编译系统对程序进行通常的编译之前,先对程序中这些特殊命令进行"预处理",然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。
主要预处理功能
宏定义:#define
文件包含:#include
条件编译:#ifndef...#endif等
代码小结
cpp
//什么是结构体?他能解决什么问题
//具体怎么用
//在现实生活中,我们通常使用属性来描述一个事物的特征: 人、身高。。。。
//所谓结构体就是把某个事物的多个变量数据类型统一在一起,这就叫一个结构体
typedef struct score_t
{
float math;
float english;
}SCORE_T;//typedef可以简化结构体名
typedef struct student_t
{
int age;
char name[20];
int sex;
float height;
int iNo;
SCORE_T score_info; //结构体里嵌套结构体
}STU_T;
//如果把结构体作为函数的参数会如何?
void test(STU_T stu);
struct student_t getStruct(STU_T stu); //结构体返回值
int main()
{
STU_T stuArray[10]={{12,"lcq",18,1.6,10001,{89.5f,56.6f}}};//结构体的所有用法和普通数组一样通过下标的方式获取和设置数据
//struct student_t stu;//定义了一个student_t的类型的变量名 stu
//可以定义的时候初始化赋值、位置需要一一对应
STU_T stu={12,"lcq",18,1.6,10001,{89.5f,56.6f}};
STU_T stu_info;
STU_T stu_msg;
STU_T ret_stu;
stu_info=stu; //结构体可以进行赋值
//还可以通过memcpy函数进行拷贝赋值
memcpy(&stu_msg,&stu,sizeof(STU_T));
//直接赋值
//stu.age=12;
//stu.age=1.8f;
//tu.iNo=24100001;
//strcpy(stu.name,"omo2410");//当结构图的属性里面有包含字符型的时候要给里面赋值就必须strcpy拷贝
ret_stu=getStruct(stu);
printf("ret_stu=%d\n",ret_stu.age);
printf("stu.age=%d\n",stu.age);
printf("stu_msg.age=%d\n",stu_msg.age);
test(stu);
stuArray[0].age=22;
//paintWindow(5,5,40,20);
//LoginWin();
return 0;
}
//在默认情况下,结构体作为函数的参数也是默认值传递
void test(STU_T stu)
{
stu.age=45;
strcpy(stu.name,"xxxx");
printf("%d",stu.age);
}
//结构体作为函数返回值
struct student_t getStruct(STU_T stu)
{
struct student_t stu_tmp;
memcpy(&stu_tmp,&stu,sizeof(STU_T));
stu_tmp.age=100;
return stu_tmp;
}