【c语言】简述结构体

本文详细介绍了C语言中的结构体,包括结构体的声明、引用和内存存储特性。首先解释了结构体的概念,强调其作为一种复杂数据类型,可以包含多个基本类型或结构体成员。接着,讨论了结构体的声明,涵盖结构体关键字、结构体名、成员变量和typedef的应用。特别提到了匿名结构体的使用。然后,探讨了结构体的引用,包括初始化、成员访问和自引用的情况。最后,深入分析了结构体在内存中的存储方式,涉及偏移量、内存对齐的原则和优化,以及如何修改默认对齐数。通过对这些概念的深入理解,有助于更好地掌握C语言的结构体使用技巧。
摘要由CSDN通过智能技术生成

一、结构体声明

1.结构体是什么?

结构体作为由程序员自己来定义的类型,其本身相对其他类型来说是复杂的,如相对int,char,long,float……等来说,下面这个结构体就可以描述更为复杂的对象’人‘:

typedef struct
{
    char name;
    int age;
    int height;
}or;

这段代码定义了一个包含name、age、height的三个成员变量的结构体类型or,而or足以片面的描述一个人,描述的复杂度是任意单一基本数据类型都无法做到的。

可以这么说:

结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。

2.结构体的声明

(1)结构体的构成

一个结构体可能由四部分构成:结构体关键字结构体名成员变量基本语法框架(可能会加入typedef类型重定义一下,这里就不算如其中了)。

struct or         //"struct"结构体关键字//“or”结构体名
{
    char name;   //成员变量1
    int age;     //成员变量2
    int height;  //成员变量3
};               //“{ }”和“;”为基本语法框架
1.1结构体关键字

struct是结构体关键字,是说明定义为结构体的关键;

1.2结构名

由程序员根据情况和需要自由命名,需要和其他类型名区别开来,同时和struct共同构成完整的结构体类型,"struct 结构名"类比基本数据类型“int”。

1.3成员变量

指结构体所包含的元素,即它的“成员”,如上例。

1.4基本语法框架

基本的语法,分别为“{ }”和“;”构成。

(2)声明结构体

2.1基本声明格式
struct 结构名
{
成员变量;
……;
};
2.2声明的同时定义结构体变量
struct or
{
    char name;
    int age;
    int height;
}ren,liu;

sturct or此时已经是一个结构体类型,后缀一个变量名当然可以创建一个变量,至于其是全局变量,还是局部变量就要看声明的位置了。

2.3 typedef在结构体声明时的应用
typedef struct or
{
    char name;
    int age;
    int height;
}ren;
typedef struct 
{
    char name;
    int age;
    int height;
}run;

typedef(类型重定义)可以将类型重定义为我们喜闻乐见的样子,其用法大家还是很清楚的,忘了的话可以再复习一下。

类似于2.2,typedef将struct or重定义为ren。

2.4 typedef和成员为该类指针
typedef struct Node
{
int data;
struct Node* next;
}node;

(3)特殊的声明:匿名结构体

struct 
{
    char name;
    int age;
    int height;
}ren;

匿名结构体顾名思义,是没有名字的结构体类型,而在结构体构成讲过,完整的结构体类型由struct+名 构成,单凭struct本身是无法单独表示一个结构体类型的。

上述代码中,匿名结构体类型仅仅作为一次性的类型使用,无法再创建出和ren一样的结构体变量,即便是声明时内容一样。

下面将通过两个例子证实本观点:

①无法再创建,仅作为一次性类型使用

错误信息为:

  1. 错误(活动)E0020未定义标识符

  1. 错误(活动)E0040应输入标识符

②异父异母双胞胎

struct 
{
    char name;
    int age;
    int height;
}* ren;

struct
{
    char name;
    int age;
    int height;
}liu;

int main()
{
    ren == &liu;
    return 0;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值