【C语言】结构体类型的定义与使用

这篇具有很好参考价值的文章主要介绍了【C语言】结构体类型的定义与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、结构体

二、结构体的定义

1.最基本的定义

2.有 typedef 的定义

3.定义即对象方式

4.定义即对象指针方式(涉及指针就会稍微复杂一点)

5. typedef结构体和结构体指针方式

三、结构体的使用


一、结构体

        结构体是用户自定义的一种类型,这种类型里面可以声明不同的数据类型,如char、int...等等,以此来满足用户对某种对象的具体描述。比如我想描述某个人的职业信息,那么通过描述他的姓名(char name[ ]),年龄(int),职业(char position[ ]),年薪( int )等就可以很清楚的知道这个的人的职业信息,当我需要把这个人的职业信息发给亲戚,总不能一句句发,而是全部整合到一起发,那么将多种数据类型整合到一起,我们可以使用结构体类型

二、结构体的定义

      结构体定义的方式有很多种:

1.最基本的定义

struct Person
{
    char name[16];
    int age;
};

        此定义,定义了一个Person结构体(记住是Person结构体,而不是叫结构体Person),意味着 struct Person才是结构体类型,struct叫做关键字,Person叫做标识符。因此,我们在使用的时候就得这样使用:

struct Person john;

这个Person结构体声明了一个对象,叫做 john。那么我们的某些编译器为了让我们节省打字压力,允许我们省略 struct 关键字:

Person john;

ps:这里Person没有变色是因为我们的结构体定义没有写进去,就写了一个声明对象。不是因为这种声明方式不可以哈(我的编译器是支持这种写法的)。但是这种写法在理论上来说是错误的(世上本没有路,走的人多了也就变成了路),如定义所说,这Person只是描述符,只有struct Person这种才代表了结构体类型,所以这种声明方式可以但不推荐大家这样写,以免对结构体定义有所混淆,那么如何正确省略struct这个关键字,看下面第2种定义。

2.有 typedef 的定义

typedef struct Person
{
    char name[16];
    int age;
}per;

        这里的定义,用口语正确表达是:首先定义了一个struct Person的结构体,然后 typedef 关键字(这个关键字我一般叫别定义。官方著这个关键字可以将复杂的声明或者数据类型另外定义一个简单的名字)将 struct Person 别定义为 per。也就是说现在 per 就等价于 struct Person。那么就有如下声明:

per john;

        这样才是正确省略struct的方式。那么可以看出,用了 typedef 之后:

struct Person john;//正确,最原始的声明

per john;//正确,typedef的声明
struct per john;//错误,per = struct Person

3.定义即对象方式

struct Person
{
    char name[];
    int age;
}per;

        这种没有使用typedef的定义方式,叫定义即对象,也就是per就是struct Person的对象,相当于第2条中的 john,且是全局变量。对于这种直接定义了对象的,可以重新使用如下声明第二个对象,也可以直接使用对象per:

struct Person john;//声明对象john

        那么这里的per,也是对象,是可以直接使用的,无需再重复声明了,如下使用

struct Person
{
    char name[16];
    int age;
}per;

int main()
{
    strcpy(per.name, "xiaoming");
    per.age = 16;
    printf("%s\n", per.name);
    printf("%d\n", per.age);

    return 0;
}

4.定义即对象指针方式(涉及指针就会稍微复杂一点)

struct Person
{
    char name[16];
    int age;
}*per;

int main()
{
    per = (Person*)malloc(sizeof(struct Person));
    strcpy(per->name, "xiaoming");
    per->age = 16;

    printf("%s\n", per->name);
    printf("%d\n", per->age);
    
    free(per);

    return 0;
}

        这种定义方式,和第3条有点类似,都是直接定义了Person结构体的对象,不过现在这个对象是个指针,所以per我们称为结构体对象指针

        如果在定义时就声明了结构体指针,这指针是全局变量,存储在静态区,在整个程序结束后才会释放 指针per 的内存(当然,要明白这里的指针per的内存说的是 指针本身的内存 ,即该指针的地址,而不是指 指针per的内容(值)所指向的内存。 这个指针的变量per 的内容(值)是另一块内存的地址,即结构体数据成员的首地址,它所指向的是结构体成员name和age所在的内存块)。

        其次,在其他函数中(如main函数)欲给 指针per 指向的数据成员赋值时,需要为数据成员开辟内存空间,使用malloc函数(因为定义对象即指针的所申请的内存仅这个指针本身,它的内容所指向的内存的空间还没有被开辟)。这样 指针per 指向的内存(数据成员的内存)就是存储在 堆 上,而非 栈(只存储局部变量) 上,也不是静态区(只存储静态变量和全局变量)。在使用完毕后,需要使用 free函数 手动释放存储在 堆 上的数据成员的内存空间。

5. typedef结构体和结构体指针方式

typedef struct Person
{
    char name[16];
    int age;
}per, *perptr;

int main()
{
    per a;
    a.age = 16;
    printf("%d\n", a.age);

    perptr v;
    v = (Person *)malloc(sizeof(struct Person));
    v->age = 14;
    printf("%d\n", v->age);
    free(v);

    return 0;
}

        看到这里,你就需要明白,既然用了typedef关键字,就代表 per 等价于 struct Person,perptr 等价于 struct Person*(这里需要加深理解哦,有typedef和没有typedef的区别,一个是结构体指针,一个是结构体对象指针)。既然是结构体指针,那么首先肯定要声明一个对象, perptr v;

三、结构体的使用

        结构体的使用其实在第二个里面有略微介绍到:主要就两种结构体和结构体指针的使用

typedef struct Base
{
    int a;
}base;

int main()
{
    //1.结构体
    base A;
    A.a = 11;
    printf("%d\n", A.a);

    //2.结构体指针
    base* B;
    B = (base*)malloc(sizeof(base));
    B->a = 12;
    printf("%d\n", B->a);
    free(B);

    //2.结构体赋值给结构体指针,即这个结构体指针指向另一个结构体 
    base* C;
    C = &A;
    printf("%d\n", C->a);
       
    return 0;
}

  文章来源地址https://www.toymoban.com/news/detail-530678.html

到了这里,关于【C语言】结构体类型的定义与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自定义类型——结构体(C语言进阶)

    目录 一、结构的声明 1.1 一般声明 1.2 特殊声明 1.3 结构体自引用 二、结构体变量的定义和初始化  2.1 结构体变量的定义 2.2 结构体变量的初始化 三、结构体内存对齐 3.1 代码分析 3.2 结构体内存对齐的规则  3.3 嵌套结构体的大小 3.4 存在结构体内存对齐的原因 3.5修改默认对

    2024年02月16日
    浏览(38)
  • 【C语言】自定义类型:结构体、枚举、联合

    目录 前言: 一、结构体 (1)结构体的特殊声明 (2)结构体的自引用 (3)结构体嵌套初始化 (4)结构体内存对齐 (5)修改默认对齐数 (6)结构体传参 (7)位段 二、枚举 (1)枚举的定义 (2)枚举的优点 (3)枚举的使用 三、联合(共用体) (1)联合类型的定义 (

    2024年02月16日
    浏览(44)
  • C语言—自定义类型(结构体、枚举、联合)

    结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 实例一(描述一本书): 在声明结构的时候,可以不完全的声明。 实例一: 注:匿名结构体类型创建好之后只能用一次(没有标签构不成结构体类型) 实例一: 注:在结构中包含一个类型

    2024年02月06日
    浏览(45)
  • C语言——自定义类型结构体_学习笔记

    结构体是一种用户自定义的数据类型,可以包含 多个不同类型的变量 。通过使用结构体,我们可以将相关联的数据组织在一起,便于管理和使用。 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型的一类。 结构体可以包含多个不同类型的数据成员,例

    2024年02月07日
    浏览(40)
  • 【C语言】自定义类型:结构体深入解析(一)

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节,阿森继续和你一起学习什么是

    2024年02月04日
    浏览(42)
  • 进阶C语言——自定义类型:结构体,枚举,联合

    结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 例如描述一个学生: 也可以写成下面这样: 在声明结构的时候,可以不完全的声明。 比如: 上面的两个结构在声明的时候省略掉了结构体标签(tag)。 那么问题来了? 在上面代码的基础

    2023年04月09日
    浏览(46)
  • 【进阶C语言】自定义类型:结构体,枚举,联合

    前言 作者简介: 热爱跑步的恒川 ,正在学习C/C++、Java、Python等。 本文收录于 C语言进阶 系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数的介绍、自定义类型结构、动态内存管理、文件操作等,持续更新! 相关专栏Python,Java等正在发展,拭目以待!

    2023年04月14日
    浏览(72)
  • 【C语言】——自定义类型详解:结构体,枚举,联合

    大家好,今天为大家分享一下C语言中的那些自定义类型:结构体,枚举,联合,还有之前可能不曾了解的结构体内存对齐、位段等知识点!!! 一、结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构的声明 : 例如描述一个学生

    2024年02月07日
    浏览(50)
  • 详解C语言自定义类型(结构体,枚举,联合)

    ❤️ 作者简介 :RO-BERRY 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱 📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新 🎄结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不

    2024年02月16日
    浏览(39)
  • 【C语言进阶】自定义类型:结构体,枚举,联合

    1.1结构体类的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 例如描述一个学生: 1.3特殊的声明 在声明结构的时候,可以不完全的声明 上面的两个结构在声明的时候省略掉了结构体标签(tag) 当我们使用匿名结

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包