又看了一遍超体,印象最深的是那个黑人上课的场景,真是我想象中的校园,一心学术。
1、结构体
没有结构体之前,在C语言中,数据的组织依靠:变量+数组。最简单的时候,只需要使用基本数据类型来定义单个变量,需要几个变量就定义几个。后来情况变复杂了,有事需要很多意义相关的变量,这时候数组出现了。数组解决了需要很多类型相同,意义相关的变量的问题。 但是数组是有限制的。数组最大的不足在于,一个数组只能存储很多个数据类型相同的变量。(譬如使用一个数据结构来保存一个学生的所有信息:姓名,学号,性别。)
什么是结构体?结构体其实就是一个集合,集合中包含很多个元素,这些元素的数据类型可以相同也可以不相同。所以结构体是一种数据封装的方法。结构体存在的意义就在于,把很多数据类型不同的变量封装在一起,组成一个大的新的数据类型。
数据结构:把庞大复杂的数据用一定的方式组织管理起来,便于操作(查找,增加,删除等)这就叫数据结构。
#include <stdio.h>
//PS:
//1.结构体类型的定义是在函数外面,不是lim
//2.结构体定义的是一个新的组合类型,而不是变量,也不消耗内存
struct student
{
char name[20]; //学生姓名
unsigned int num; //学号
int male; //性别
}; //注意;不能少
int main()
{
struct student s1; //s1是一个变量,类型是struct student,定义,无初始化
//给结构体变量赋值
s1.name[0]='t';
s1.name[1]='h';
s1.name[2]='o';
s1.name[3]='r';
s1.name[4]=' ';
s1.num=1;
s1.male=0;
printf("s1.name=%s
",s1.name);
printf("s1.num=%d
",s1.num);
printf("s1.male=%d
",s1.male);
// printf("
");
return 0;
}
结构体和数组的关联:数组是一种特殊的结构体,特殊之处在于封装内的各个元素类型是相同的。结构体和数组都输对一些子元素的封装,因此定义的时候都是封装作为整体定义,但是使用的时候,都是使用封装中的子元素。一般结构体变量和数组变量都不会作为一个整体操作。
使用结构体的步骤:
第一步:定义结构体类型。结构体类型的定义是在函数外面。
第二步:使用第一步定义的类型来定义结构体变量。
第三步:使用变量。实际上使用结构体变量的时候,使用的是结构体变量中封装的各个子元素,而不是结构体变量本身。
结构体定义
struct student
{
char a;
int b;
float c;
double d;
};
int main()
{
struct student s=
{
.a = 1,
.b = 2,
.c = 3,
.d = 4,//C++扩展的定义方式,梦幻级的方法,想定义谁就定义谁,可以跳过元素
} ;
struct student s0={1,2,3,4};完全初始化,依次一个个初始化。
}
2、共用体union
union在定义和使用形式上和struct很相似。但是两种数据结构是完全不同的两类东西。
结构体,是对多个数据的组合与封装。
共用体,共用体中只有一个东西,只是它被好几个名字(和类型)共用。
#include <stdio.h>
struct male
{
char name[20];//男生。名字。年纪。篮球课成绩。
int age;
int basketball;
};
struct female
{
char name[20];//女生。名字。年纪。健美操成绩。
int age;
int aerobics;
};
union student
{
struct male m;//使用.m时男生,male结构体。用.f女生,female结构体
struct female f;
};
int main(void)
{
union student u1;
u1.f.aerobics = 100;
printf("u1.m.basketball=%d
u1.f.aerobics=%d
",u1.m.basketball,u1.f.aerobics);
return 0;
}
3、宏定义
#define N 123//宏定义的格式
//ps:1.宏定义一般在函数的外面 2.宏定义必须要先定义,在使用宏。 3.宏名一般用大写