C语言自定义类型

(一)结构体

定义:结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义,不同类型的变量集合 ;不同于数组: 相同类型变量集合 。      结构体组成:一定是数据,类型随便

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘 关

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值