如何系统学习C 语言(中)之 结构体篇
1,结构体
在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现——它们都只适合单一属性的数据。那现实生活中,很多对象都是具有多属性的。例如一个人,都具有姓名、年龄、身高、体重等各种属性。那该如何是好呢?
别急,C语言中的结构体属于复合类型,它是其他数据类型构造出的一个新数据类型。结构体可以拥有众多的成员,而且各成员的数据类型可以各不相同。因此,它是非常适合拥有多属性的对象进行存储。
Ⅰ,结构体类型的定义
定义格式为:
struct 结构体类型名{
数据类型 成员名;
数据类型 成员名;
...
}; //特别注意此处的分号不要遗忘
下面试着定义关于人的结构体类型,例如:
struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
};
特别注意,上面定义的是一个结构体类型,它是不能用于存储数据的。就好像int 是一个数据类型,它是不能存储数据一样。如果要存储数据需要再定义出该类型的变量,如:
int a;
下面就说一下如何定义结构体类型的变量。
Ⅱ,结构体变量的定义
1,先定义结构体类型,再定义结构体变量,例如:
struct Person p1; //注意:这条语句是定义了struct Person 类型的变量p1。也就是说,结构体类型不光是类型名字本身,前面还需加上“struct”关键字。
2,在定义结构体类型的同时定义结构体变量,例如:
struct Person{
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p2;
3,定义无名结构体类型变量,例如:
struct {
char name[20]; //姓名
int age; //年龄
float height; //身高
float weight; //体重
} p3;
Ⅲ,结构体变量的初始化与赋值
再定义结构体变量时,可以对其进行初始化。结构体变量的初始化方式与数组类似,使用大括号将初始值列表括起来。不过,列表中初始值的类型和顺序要与结构体成员的类型和顺序匹配。例如:
struct Person p1 = {"Tom",20,1.70f,60.1f};
Ⅳ,结构体成员的访问
C语言中,使用成员访问运算符(“.”)来访问结构体变量的各成员,我们常说的点运算说的就是它了:
结构体变量名.成员名
Ⅴ,结构体的大小
基本数据类型都有相对固定的大小,而结构体是符合数据类型,它的成员的类型、数量都是不固定的,但我们可以通过sizeof运算符来获取结构体的大小,例如:
printf("Size of the struct Person: %u bytes.\n",sizeof(struct Person));
Ⅵ,结构体的嵌套
C语言中可以将一个结构体作为另外一个结构体的成员,即允许结构体的嵌套使用,如下例子:
//定义一个日期的结构体类型Date
struct Date{
short year;
short month;
short day;
};
//然后再Person的结构体中再添加一个Date结构体类型的成员birthday,用来表示人的生日
struct {
char name[20];
int age;
float height;
float weight;
struct Date birthday; //生日
} ;
//初始化如下:
struct Person ls={"lisi",20,1.52,45.5,{1999,8,28}};
//访问birthday中的成员如下方式
ls.birthday.year;
ls.birthday.month;
2,结构体的运用
上面介绍了结构体类型与结构体变量之后,下面我们就要学着运用它了。不要让结构体孤零零的存在,要让它发挥应用的作用,应该让它与指针、数组、函数等结合起来,只有这样我们的代码才会灵活、高效、优美。
至于江湖中结构体与指针、结构体与数组、结构体与函数以及结构体与字符串的打打杀杀,亦或是人情世故,就留给我们自己到江湖上去体会吧!
最新文章
- render :template 和 render :parital
- adb pull apk
- slid.es – 创建在线幻灯片和演示文稿的最佳途径
- 设置函数环境——setfenv
- 如何实现SSH断开后 进程仍然在后台运行
- poj 1753 Flip Game
- 04.URL路径访问与模块控制器之间的关系
- mount: can't find cdrom in /etc /fstab or /etc/mtab
- IOS_OC_本地推送知识总结
- ASP.NET NuGet to install the mvc 5.2.2
- cdoj 秋实大哥与战争
- BNU Online Judge-34973-Liserious战队
- 吾八哥学Python(一):搭建Python开发环境(Windows)
- 18-10-31 Scrum Meeting 3
- UITextField只能输入数字NSCharacterSet实现
- 对于";单链表逆置和递归";的问题的理解.
- FakeImageExploiter v1.3
- MySQL C API 访问 MySQL 示例
- Java_Certificates does not conform to algorithm constraints
- 对于火狐浏览器中title不能换行自动变成...怎么解决的?