(一)结构体
定义:结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义,不同类型的变量集合 ;不同于数组: 相同类型变量集合 。 结构体组成:一定是数据,类型随便
C语言提供关键字struct来标识所定义的结构体类型。
创建结构体的语法:只能在全局区域定义结构体
struct 结构名
{
//结构体成员: 变量
};
//分号不能省略
//结构体一般描述是一系列事物的抽象
//抽象的是共同的属性(特征-->数据描述)
注意: 结构体数据必须通过结构体变量访问。
结构体的类型:struct +自己取的名字
struct Student mm; //结构体变量
//前缀起到标识作用,只需要看数据类型。
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
struct student
{
char name[20];
int age;
int score;
};
int main() {
//No.1 定义变量
struct student memory = { "Iloveyou",18,59 };
struct student joker;
//先创建后初始化,成员变量以前是怎么用,现在就怎么用
//前缀的含义是主体,表示整个成员是谁。
//joker.name = "joker"; //字符数组不能直接复制
strcpy_s(joker.name, 20, "joker");
joker.age = 18;
joker.score = 99;
//No.2 用户输入结构体变量
//No.3 结构体数组--->管理表格数据
printf("请输入3个学生信息:");
struct student array[3];
for (int i = 0; i < 3; i++)
{
scanf_s("%s%d%d", array[i].name, 20, &array[i].age, &array[i].score);
}
printf("姓名\t年龄 \tscore\n");
for (int i = 0; i < 3; i++)
{
printf("%s\t%d\t%d\n", array[i].name, array[i].age, array[i].score);
}
printf("姓名\t年龄 \tscore\n");
for (int i = 0; i < 3; i++)
{
printf("%s\t%d\t%d \n", (array + i)->name, (array + i)->age, (array + i)->score);
}
//No.4 指针
struct student* p = NULL;
//p->age = 12; //错误,空里面没有这个age
//结构体指针变成结构体变量
//4.1 指向普通变量
p = &memory;
printf("%s\t%d\t%d \n", p->name, p->age, p->score);
printf("%s\t%d\t%d\n", (*p).name, (*p).age, (*p).score);
//->: 怎么打出来 先打减号 在打大于号
//4.2 动态内存申请
struct student* pM = (struct student*)malloc(sizeof(struct student));
assert(pM);
scanf_s("%s%d%d", pM->name, 20, &pM->age, &(*pM).score);
printf("%s\t%d\t%d\n", pM->name, pM->age,pM->score);
free(pM);
pM = NULL;
return 0;
}
(二)联合体
联合体,是union 的中文解释,又称为共用体。合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。 数据占用内存是同一块的内存。 应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
#include <stdio.h>
#include <stdlib.h>
//联合体:共用体
union MM
{
char name[20];
int age;
};
int main()
{
union MM mm = { "A" };
//union MM mm2 = { "A" ,68}; //错误的写法,不能同时给两个数据赋值
printf("%d\n", mm.age);
return 0;
}
//所有数据成员用的是同一段内存,即内存最长的那个变量的内存
//因此定义的时候不能直接初始化两个数据
//任何时候共用体只有一个数据有效
(三)枚举类型
枚举类型:枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型 [1] 。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
枚举类型是符号常量,整形常量。(用英语符号表示特定数字)
默认初始化:
若不设置,默认从0起,++1;
若有部分初始值,没有的=前一个的值+1;
#include <stdio.h> #include <stdlib.h> //enum 枚举类型名{符号1,符号2,...}; enum COLOR{Red,Green,Blue,Yellow}; enum Eement {Wall=1,Road=0,Box=4,End=3,People=5}; //部分初始化,部分默认 //不写的是写了+1 enum NUM {a=1,b,c=4,d}; //b=a+1:2 //d=c+1:5 void print(int num) { printf("%d\n", num); } //C语言把枚举理解int, C++的枚举类型不能当做一个简单的int类型 void printEnum(enum COLOR cnum) { printf("%d\n", cnum); } //enum class int main() { printf("red:%d\n", Red); printf("Green:%d\n", Green); printf("Blue:%d\n", Blue); printf("Yellow:%d\n", Yellow); printf("%d\t%d\t%d\t%d\n", a, b, c, d); print(Red); printEnum(a); printEnum(1); return 0; }