当前位置:网站首页 > 技术博客 > 正文

c语言结构体是啥



在本教程中,您将学习C语言编程中的结构类型。您将借助示例学习定义和使用结构。

在C语言编程中,有时需要存储实体的多个属性。 实体不必仅具有一种类型的所有信息。 它可以具有不同数据类型的不同属性。

C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。

结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:

为了定义结构,您必须使用 struct 关键词。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。下面是声明 Book 结构的方式:

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为示例:

在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

执行输出结果为:

书名: C 语言 作者: nhooo 主题: 编程语言 BookID 

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。下面的示例演示了结构的用法:

当上面的代码被编译和执行时,它会产生下列结果:

Book 1 书名: C 编程语言 Book 1 作者: Nuha Ali Book 1 主题: C 编程语言教程 Book 1 编号:  Book 2 书名: JAVA编程语言 Book 2 作者: Seagull Ali Book 2 主题: JAVA编程语言教程 Book 2 编号: 

您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面示例中的方式来访问结构变量:

当上面的代码被编译和执行时,它会产生下列结果:

Book 书名: C 编程语言 Book 作者: Nuha Ali Book 主题: C 编程语言教程 Book 编号:  Book 书名: JAVA编程语言 Book 作者: Seagull Ali Book 主题: JAVA编程语言教程 Book 编号: 

您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:

struct Books *struct_pointer;

现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:

struct_pointer = &Book1;

为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:

struct_pointer->title;

让我们使用结构指针来重写上面的示例,这将有助于您理解结构指针的概念:

当上面的代码被编译和执行时,它会产生下列结果:

Book 书名: C 编程语言 Book 作者: Nuha Ali Book 主题: C 编程语言教程 Book 编号:  Book 书名: JAVA编程语言 Book 作者: Seagull Ali Book 主题: JAVA编程语言教程 Book 编号: 

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。

所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

典型的示例:

位域定义与结构定义相仿,其形式为:

struct 位域结构名 { 位域列表 };

其中位域列表的形式为:

类型说明符 位域名: 位域长度

例如:

说明 data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位。

让我们再来看一个示例:

在这里,packed_struct 包含了 6 个成员:四个 1 位的标识符 f1..f4、一个 4 位的 type 和一个 9 位的 my_int。

对于位域的定义尚有以下几点说明:

从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

位域的使用和结构成员的使用相同,其一般形式为:

位域变量名.位域名 位域变量名->位域名

位域允许用各种格式输出。

请看下面的示例:

上例程序中定义了位域结构 bs,三个位域为 a、b、c。说明了 bs 类型的变量 bit 和指向 bs 类型的指针变量 pbit。这表示位域也是可以使用指针的。

我们使用typedef关键字为数据类型创建别名。它通常与结构一起使用,以简化声明变量的语法。

此代码

struct Distance{     int feet;     float inch; }; int main() {     struct Distance d1, d2; }

等同于

typedef struct Distance{     int feet;     float inch; } distances; int main() {     distances d1, d2; }

您可以在C语言编程中的结构内创建结构。例如,

struct complex { int imag; float real; }; struct number {    struct complex comp;    int integers; } num1, num2;

假设,你要设置num2的变量imag值为11,怎么做呢?看下面示例:

num2.comp.imag = 11;

假设您要存储有关一个人的信息:他/她的姓名,身份证号和薪水。您可以创建不同的变量name,citNo和salary存储此信息。

如果您需要存储多个人的信息怎么办?现在,你需要为每个人每个信息创建不同的变量:name1,citNo1,salary1,name2,citNo2,salary2, 等。

更好的方法是在单个名称Person结构下收集所有相关信息,并将其用于每个人。

版权声明


相关文章:

  • hashmap和concurrenthashmap的区别1.82025-07-29 18:01:04
  • js事件监听默认第三个参数2025-07-29 18:01:04
  • pvp手机ftp服务器apk2025-07-29 18:01:04
  • python中argparse2025-07-29 18:01:04
  • 哈夫曼树的原理2025-07-29 18:01:04
  • 网络地址转换nat技术2025-07-29 18:01:04
  • oracle rman备份与恢复2025-07-29 18:01:04
  • snat,dnat2025-07-29 18:01:04
  • maven仓库类型有哪些2025-07-29 18:01:04
  • 三种linux常见的文件系统2025-07-29 18:01:04