结构体
声明
结构体有三个重要的组成部分,编写的规范见 结构体.菜鸟教程
- 定义:你先存放多种数据,那我先把这些放到
{}
里,表示了结构体里有哪些变量 - 变量:你想让谁是结构体?
- 标签:这个结构体用完之后还要再写一遍不方便,我们把这个结构体保存下来
比如我们定义一下
//下面定义一个圆,所有圆都有这些属性,把他们全写在一起,就成了结构体:
struct circle
{
//圆的半径直径面积周长
float R;
float D;
float S;
float C;
//圆的范围(大还是小)
char *range;
//颜色
char *color;
};
//typedef可以给“struct circle”取一个别名,叫Circle,以后直接用Circle代替那两个单词。
typedef struct circle Circle;
//现在我想要2个圆
Circle circle_1;
Circle circle_2;
存数据
前面是对结构体的声明,跟整型声明 int a
一样,都是声明,接下来我们存放数据。
整型很简单,直接 a = 1
,但对具有多个变量的结构体来说,需要对每部分存放
//给圆赋属性
circle_1.R = 10;
circle_1.D = 2*circle_1.R;
circle_1.S = 3.14*circle_1.R*circle_1.R;
circle_1.C = 3.14*circle_1.D;
strcpy(circle_1.range, "large");
strcpy(circle_1.color, "yellow");
circle_2.R = 2;
circle_2.D = 2*circle_1.R;
circle_2.S = 3.14*circle_1.R*circle_1.R;
circle_2.C = 3.14*circle_1.D;
strcpy(circle_2.range, "small");
strcpy(circle_2.color, "red");
这里的 .
实际上是访问成员的意思,本质上是先找到他,然后给它赋值
我们可以把这一步整合起来
circle_1 = (Circle){10, 2*circle_1.R, 3.14*circle_1.R*circle_1.R, 3.14*circle_1.D, "large", "yellow"}
我们还可以在一开始就初始化
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book_1 = {"C 语言", "RUNOOB", "编程语言", 123456};
还可以一次批量定义多个,我们把由结构体作为基本元素的数组叫结构数组。
struct address
{
char name[30];
/*姓名,字符数组作为结构体中的成员 */
char street[40]; /*街道*/
unsigned long tel; /*电话,无符号长整型作为结构体中的成员 */
unsigned long zip; /*邮政编码*/
}student[3]={
{"Zhang","Road NO.1",111111,4444},
{"Wang"," Road NO.2",222222,5555},
{"Li"," Road NO.3",333333,6666}
};
指针
//定义一个指针(地址),指向一个结构体
Circle* pcircle_1;
//然后这个地址就是circle_1的地址。
pcircle_1 = &circle_1;
//“.”符号就变成"->"符号了
printf("circle_1的面积是%d\n",pcircle_1->S);
// 下面这个意思是,假如我想定义一个地址来存放结构,需要Circle* p;
typedef struct circle
{
}Circle, *pCircle;
但在上面结构大括号后加了一个*pCircle ,定义地址直接用pCircle p;
其他
结构体在程序中的位置要注意: 结构体的用法.CSDN
// enum定义结构体,可以包含多个数据
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day;
day = WED;
printf("%d",day);
return 0;
}
// typedef可以定义新的类型,比如布尔类型
typedef int BOOL;
#define True 1
#define False 0
BOOL bflag = True;