博客
关于我
C语言:结构体——《手把手将你学C语言》
阅读量:248 次
发布时间:2019-03-01

本文共 2064 字,大约阅读时间需要 6 分钟。

C语言结构体

概论

结构体就是集成了若干不同组分的可自定义的数据类型。算是面向对象编程中类和对象的前身。例如一个学生机构体,可以包含一个学生的姓名,年龄,性别,学号,班级等信息。

结构体的定义和使用

结构体的声明

struct 机构体名{   成员列表};

最后的分号一定不要忘记加。

struct只是一个关键字,表明这是一个结构体,而结构体名才是真正的数据类型名,而且结构体名一般大写。

struct STUDENT{   	int age;	int grade;	char name[20];	char addr[30];};

上述代码中的STUDENT才是和int等价的东西。不过也就是说,上述代码仅仅是定义了一个结构体类型而已,还不能直接使用。

结构体类型变量

只有定义了结构体类型变量后,也就是相当于类有了实现对象后,才能发挥出功效。

struct STUDENT{   	int age;	int grade;	char name[20];	char addr[30];}stud;

stud才是具有内存空间的实际变量,而变量的对内部项的引用,有以下三种方式。

结构体对数据的引用

#include
#include
struct STUDENT{ int age; int grade; char name[20]; char addr[30];};int main(void){ struct STUDENT s1={ 12,100,"小明","北京"}; strcat(s1.name,"小刚"); s1.age=18; printf("%d\n",s1.age); printf("%s",s1.name); return 0;}

对于指针对结构体进行操作,指针指向就是结构体首元素的地址,但是要注意的是,虽然二者在内存是同一块内存,但是数据类型很可能不一致,一个是机构体型指针,另一个则是自己类型的指针,在使用区分使用。

结构体的初始化
对于结构体变量的初始化,最好在定义时就进行全部的赋值,否则未赋值数据只能在后续通过引用的方式一个个赋值。

结构体的字节对齐

对于结构体内数据的内存分配上,不会采取一个个对应分配累加的方式,而会采用一种看齐最高内存存储方式的形式。比如下列代码。

struct STUDENT{   	char a1;	char a2;	int b;	};

char a1和char a2的内存大小不分别是1,因为这个结构体中最大内存需要的是int的4个字节,所以第一个a1也是四个字节,而a2则跟在a1的四个字节中,也就是连个char共用四个字节。

但是顺序上必须是连续的,否则就实现不了共享。例如下面。

struct STUDENT{   	char a1;	int b;	char a2;	};

这样的话,总内存就是12个字节了。

所以我们在设计结构体时候要遵循一定的大小顺序去安排数据变量。

结构体数组

定义:struct STUDENT stu[10];

这个就以为着创立了一个十个机构体变量的数组。
同理对于机构体数组的初始化和使用和基本数组,结构体完全类似。

结构体指针

同样地,我们也可以使用指针的方式引用结构体的数据。

#include
#include
struct STUDENT{ int age; int grade; char name[20]; char addr[30];};int main(void){ struct STUDENT s1={ 12,100,"小明","北京"}; struct STUDENT *p=&s1; strcat((*p).name,"小刚"); (*p).age=18; printf("%d\n",(*p).age); printf("%s",(*p).name); return 0;}

而且*p的()是不可以省略的,因为.符号的运算优先度最高,所以省略括号就变成了*(p.name)

初此之外,我们还有一种更直观,更简洁,也是更加常用的表达形式。

p->name;

#include
#include
struct STUDENT{ int age; int grade; char name[20]; char addr[30];};int main(void){ struct STUDENT s1={ 12,100,"小明","北京"}; struct STUDENT *p=&s1; strcat(p->name,"小刚"); p->age=18; printf("%d\n",p->age); printf("%s",p->name); return 0;}

转载地址:http://lvux.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
查看>>
Mysql学习总结(63)——Mysql数据库架构方案选择与分析
查看>>
Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
查看>>
Mysql学习总结(65)——项目实战中常用SQL实践总结
查看>>
Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
查看>>
Mysql学习总结(67)——MYSQL慢查询日志
查看>>
Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
查看>>
Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
查看>>
Mysql学习总结(6)——MySql之ALTER命令用法详细解读
查看>>
Mysql学习总结(70)——MySQL 优化实施方案
查看>>
Mysql学习总结(71)——MySQL 重复记录查询与删除总结
查看>>
Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
查看>>
Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
查看>>
Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
查看>>
Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
查看>>
Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>