一个结构就是一个复合的数据类型,其中可以有各种类型的它的成员,用一个变量来表达这些数据。
结构体和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,所以通常在函数外部声明结构类型,这样就可以被多个函数所使用了。
目录
声明结构的形式:
struct point{
int x;
int y;
};//注意分号。
struct point p1,p2;
这个代码中,struct point 是一种结构类型,point是这个结构的名字。 p1,p2是结构声明的变量,也就是所声明变量的名字是p1,p2,每一个变量中都包含x和y两个整形变量。
第二种声明方式:
struct {
int x;
int y;
}p1,p2;
//这是一个无名结构;
//p1,p2是变量的名字,并不是结构类型的名字。
第三种声明方式:
struct point{
int x;
int y;
}p1,p2;
//声明了一个结构,这个结构的名字是point,并同时定义了两个变量:p1,p2。
结构的初始化:
- 结构用.(点)运算符和名字访问其成员,结构名称.变量名称。
today.day;
p1.x ;
p2.y;
#include <stdio.h>
struct date{
int month;
int day;
int year;
};
int main()
{
struct date today = {11,14,2021};
//按顺序给变量初始化,11给month,14给day,2021给year;
struct date thismonth = {.month=7,.year=2014};
//具体指明将值给哪一个变量赋值,未指明的变量会被赋值为0,可以运行代码尝试。
printf("Today's date is %i-%i-%i.\n",
today.year, today.month, today.day);
printf("This month is %i-%i-%i.\n",
thismonth.year, thismonth.month, thismonth.day);
return 0;
}
结构运算:
- 要访问整个结构,直接用结构变量的名字。
- 对于整个结构,可以做赋值、取地址,也可以传递给函数参数。
p1 = (struct point){5,10};
赋值运算,强制类型转换,相当于p1.x = 5; p1.y = 10;
p1 = p2;
相当于p1.x = p2.x; p1.y = p2.y;
结构作为函数参数:
int Days ( struct date d )
- 整个结构可以作为参数的值传入函数;
- 这时候实在函数内新建一个结构变量,并复制调用者的结构的值;
- 也可以返回一个结构;
指向结构的指针:
和数组不同,结构变量的名字不是结构变量的地址,必须用&运算符。
struct date *p= &myday;
struct date{
int month;
int day;
int year;
};
struct date *p = &myday;//初始化一个结构指针。
(*p).month = 12;
p->month = 12;用->表示指针所指的结构变量中的成员。
结构数组:
struct date dates[100];
struct date dates[] =
{
{7,5,2003},{9,1,2009}
}; //初始化
dates[0].month == 7;
dates[0].day ==5;
dates[0].year ==2003;date[1]同理
结构中的结构 :
struct point{
int x;
int y;
};
struct rectangle{
struct point pt1;
struct point pt2;
};
定义一个变量 struct retangle r;
就可以得到 r.pt1.x , r.pt1.y, r.pt2.x, r.pt2.y
自定义数据类型(typedef):
- C语言提供了一个叫做 typedef 的功能来声明一个已有的数据类型的新名字
比如:typedef int Length
使得 Length 成为 int 类型的别名。
- 这样,Length 这个名字就可以代替int 出现在变量定义和参数声明的地方了。
- Length a,b,len;
- Length numbers[10];
typedef 结构类型 变量名称
- 最终我们可以使用变量名称去替代某种类型。
所以我们可以对长长的结构类型使用typedef .
typedef struct ADate{
int month;
int day;
int year;
}Date;
Date d = {7, 5, 2003};//使用变量名称进行初始化,缩减敲代码时长。