C语言:枚举、结构和联合

本文详细介绍了C语言中的枚举、结构和联合。枚举提供了一种用符号表示常量的方式,自动计数且可以指定值。结构允许组合不同类型的数据,可以通过.或->运算符访问成员,并可作为函数参数。联合则特性独特,所有成员共享空间,但同一时刻只有一个成员有效。此外,还提及了typedef用于为已有数据类型创建新名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.枚举

常量符号化

  • 用符号而不是具体的数字来表示程序中的数字
const int red=0;
const int yellow=1;
const int green=2;
  • 枚举
enum COLOR{RED,YELLOW,GREEN};

枚举

  • 一种用户定义的数据类型,用关键字enum以如下语法来声明
    enum 枚举类型名{名字0…名字n};
  • 枚举类型名字不太真的使用,大括号内的名字是真正要用的,类型是int,值依次从0到n。
  • 需要排起来的常量值时使用
  • 枚举量可以作为值
  • 枚举类型可以跟上enum作为类型
  • 但是实际上是以整数来做内部计算和外部输入输出的。
#include<stdio.h>
enum color{red,yellow,green};
void f(enum color c);
int main(void)
{
	enum color t=red;

	scanf("%d",&t);
	f(t);
	return 0;
}
void f(enum color c)
{
	printf("%d\n",c);
}
  • 套路:自动计数的枚举
enum COLOR{RED, YELLOW,GREEN,NumColors};
  • 可以指定值
enum COLOR{RED=1,YELLOW/*1+1*/,GREEN=5};

2.结构

  • 声明结构类型
	...
struct date{
	int month;
	int day;
	int year;
	};//声明某种结构类型
	...
struct date today;//定义某种结构变量
  • 通常声明在函数外,所有函数都可使用

结构的初始化

struct date today={07,31,2014};
struct date thismonth={.month=7,.year=2014};

结构成员

  • 结构用.运算符和名字访问成员
  • 指针用->访问成员

结构运算

  • 访问整个结构直接用结构变量的名字
  • 对于整个结构可以赋值、取地址,也可以传递给函数参数
    • p1=(struct point){5,10};//相当于p1.x=5,p1.y=10
    • p1=p2;//相当于p1.x=p2.x;p1.y=p2.y;

结构指针

  • 和数组不同,结构变量名并不是结构变量的地址
  • struct date *pDate=&today;

结构作为函数参数

  • 可以作为参数传入函数
  • 可以作为返回值整体返回

输入结构

注意:不能直接传结构到函数中,函数被释放后结构的赋值会被释放

  • 创建一个输入函数返回一个结构变量,赋给main函数中的结构变量
  • 直接传结构指针
struct point*getStruct(struct point*);
void output(struct point);
void print(const struct point *p);

int main()
{
	struct point y={0,0};
	getStruct(&y);
	output(y);
	output(*getStruct(&y));
	print(getStruct(&y));
}
struct point* getStruct(struct point*p)
{
	scanf("%d",&p->x);
	scanf("%d",&p->y);
	printf("%d,%d",p->x,p->y);
	return p;//经常通过修改指针并返回结构体来使函数更加通用
}
void output(struct point p)
{
	printf("%d,%d",p.x,p.y);
}
void print(const struct point *p)
{
	printf("%d, %d",p->x,p->y);
}

结构数组

结构数组初始化

struct date dates[100];
struct date dates[]={{4,5,2005},{2,4,2005}};

结构中的结构

struct point{
	int x;
	int y;
	};
struct rectangle{
	struct point pt1;
	struct point pt2;
	};
struct rectangle r,*rp;
rp=&r;
以下几种表达方式等价
r.pt1.x;
rp->pt1.x
(r.pt1).x
(rp->pt1).x
初始化
r={
		{{1,2},{3,4}},
		{{5,6},{7,8}}
	};

类型定义typedef

  • typedef用于声明一个已有的数据类型的新名字
  • typedef+源类型+新名字
typedef int Length;//Length等价于int

typedef char*Strings[10];//Strings是十个字符串的数组类型

typedef struct node{
	int data;
	struct node*next;
}aNode;typedef struct node aNode;//这样用aNode就可以代替struct node

联合

union AnElt{
	int i;
	char c;
}elt1,elt2;

elt1.i=4;
elt2.c='a';
elt2.i=OxDEADBEEF;

存储

  • 所有成员共享一块空间
  • 同一时间只有一个成员是有效的
  • union的大小是其最大的成员
    初始化
  • 对第一个成员做初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值