0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言结构体的详细资料介绍

Wildesbeast 来源:今日头条 作者:嵌入式笔记v 2020-04-12 12:01 次阅读

引言

不管什么样的编程语言,数据类型的不断衍生都是为了不同场合对其进行不同处理或管理。 比如单一的变量,我们可以定义成char, short,,int,float, double等;而如果需要管理多个同一类型的数据就可以使用数组来统一管理;那么如果是不同的数据类型,但是彼此是相关联的呢? 此时就可以使用结构体来统一管理,这也是面对对象的基本思想。比如一个学生,他有如下信息: 名字(char *), 年龄(uint8), 成绩(float)等。今天我们就来说说结构体的基本使用,后续再深入研究。

结构体的定义

使用struct关键字定义原生结构体类型

struct people{ char name[20]; int age;};

使用typedef类型自定义结构体类型

typedef struct people1{ char name[20]; int age; }people1_t;

两种方式的有何不同呢? 第一种属于原生结构体类型,在定义变量之前,都需要加上struct people

struct people p1;

而第二种使用typedef关键字自定义了people_t类型(people1_t等同于struct people1), 即在定义变量时,只需要在变量之前写上people_t即刻。

people1_t p2;

这两种方式都可,用户根据自己的习惯选择其中一种即刻,个人推荐第二种,定义比较方便~

定义结构体变量和初始化

如上所述,使用第一种struct people定义结构体变量时,有如下方式:

struct people{ char name[20]; int age;};int main(void){ struct people p1; //使用struct people定义变量p1 return 0;}

或:

//定义类型的同时定义变量struct student{ char name[20]; int age;}std;int main(void){ std.age =23; //直接使用std结构体变量 return 0;}

使用typedef方式定义结构体变量

typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ people1_t p2; return 0;}

接下来我们再介绍结构体的两种方式初始化:

#include 《stdio.h》#include 《string.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //方式一:在定义的变量的同时初始化 struct people p1 ={ .name = “xiaoming”, .age = 23 }; people1_t p2; //方式二: 定义变量后,再对其初始化 strcpy(&p2.name[0], “xiaohong”); p2.age = 45; printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); printf(“p2.name = %s, age = %d. ”, p2.name, p2.age); return 0;}

编译运行:

结构体的元素访问

C语言中有两种方式访问,分别是“。”和“-》”, 具体参考如下代码:

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct people{ char name[20]; int age;};typedef struct people1{ char name[20]; int age; }people1_t;int main(void){ //定义结构体变量,并初始化 struct people p1 ={ .name = “xiaoming”, .age = 18 }; //定义结构体指针变量 people1_t *p2 = NULL; //申请people1_t结构体大小的堆内存空间,并将得到的起始地址赋予p2 p2 = (people1_t *)malloc(sizeof(people1_t)); if(NULL != p2) { //初始化 strcpy(&p2-》name[0], “xiaohong”); p2-》age = 26; } //结构体变量通过‘。’来访问其元素 printf(“p1.name = %s, age = %d. ”, p1.name, p1.age); //结构体变量通过‘-》’来访问其元素 printf(“p2.name = %s, age = %d. ”, p2-》name, p2-》age);}

编译运行结果:

以上两种方式都是使用下标式访问结构体元素, 那么如何使用指针方式访问呢?

#include 《stdio.h》#include 《string.h》#include 《stdlib.h》struct my_test{ int a; //4 double b; //8 char c; //1};int main(void){ struct my_test s1; s1.a = 12; s1.b = 3.4; s1.c = ‘a’; int *p1 = (int *)&s1; double *p2 = (double *)((long unsigned int)&s1 + 8); char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); printf(“s1.a = %d. ”, s1.a); printf(“s1.b = %.1f. ”, s1.b); printf(“s1.c = %c. ”, s1.c); printf(“===================== ”); printf(“*p1 = %d. ”, *p1); printf(“*p2 = %.1f. ”, *p2); printf(“*p3 = %c. ”, *p3);}

分析:

int *p1 = (int *)&s1,其中&s1为结构体的起始地址,也是首元素a的地址,因此可以通过类型转化后赋值给p1(int *类型,指向int类型的变量a)

double *p2 = (double *)((long unsigned int)&s1 + 8); 其中因为&s1是作为结构体地址,本身是带有数据类型的,我们通过(long unsigned int)将其转化成普通的长整型数值,然后再加上a(8字节)的长度,之后的地址就是结构体第二个元素b的地址了,于是乎将得到的地址转化成double *类型赋值给p2,通过p2来访问。

char *p3 = (char *)((long unsigned int)&s1 + 8 + 8); 与上步骤分析一致, 首先将&s1转化成普通的普通的长整型数值,然后加上元素a 和 元素b的数据类型长度,就得到了元素c的地址,再赋值给p3,通过p3来访问结构体元素c。

编译运行结果:

总结

从数组到结构体的进步之处:数组有2个明显的缺陷:第一个是定义时必须明确给出大小,且这个大小在以后不能再更改(这里不考虑可变数组);第二个是数组要求所有的元素的类型必须一致。

结构体就完美解决了数组的第二个缺陷的,可以将结构体理解为一个其中元素类型可以不相同的数组。结构体完全可以取代数组,只是在数组可用的范围内数组比结构体更简单,使用更方便。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7601

    浏览量

    136254
  • 代码
    +关注

    关注

    30

    文章

    4756

    浏览量

    68370
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28334
收藏 人收藏

    评论

    相关推荐

    结构成员的顺序会影响结构的大小吗

    相同的结构成员,如果把顺序调整一下,会不会影响结构的大小? 答案是会的,这主要跟字节对齐有关。 比如这样的结构
    的头像 发表于 11-25 16:24 86次阅读

    C语言C++中结构的区别

    同样是结构,看看在C语言C++中有什么区别?
    的头像 发表于 10-30 15:11 150次阅读

    C语言与Java语言的对比

    C语言和Java语言都是当前编程领域中的重要成员,它们各自具有独特的优势和特点,适用于不同的应用场景。以下将从语法特性、内存管理、跨平台性、性能、应用领域等多个方面对C
    的头像 发表于 10-29 17:31 218次阅读

    技术干货驿站 ▏深入理解C语言:掌握程序结构知识

    在计算机编程的世界中,C语言被广泛认可为一门强大而高效的编程语言,其简洁的语法和直接的指令使得它成为了许多程序员的首选。了解C语言的程序
    的头像 发表于 07-27 08:45 1232次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:掌握程序<b class='flag-5'>结构</b>知识

    嵌入式中C语言结构基本实现

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的数据。
    的头像 发表于 05-11 08:49 954次阅读
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b><b class='flag-5'>体</b>基本实现

    C语言结构史上最详细的讲解【软件干货】

    struct结构数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(
    的头像 发表于 03-28 17:52 697次阅读

    嵌入式系统中C语言结构的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 450次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>结构</b><b class='flag-5'>体</b>的基础实现与应用

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理
    的头像 发表于 02-28 14:25 591次阅读

    plc编程语言c语言的联系 c语言和PLC有什么区别

    语言,主要用于开发各种应用程序。尽管PLC编程语言C语言有一些相似之处,但它们之间也存在一些明显的区别。 首先,PLC编程语言
    的头像 发表于 02-05 14:21 3905次阅读

    vb语言c++语言的区别

    VB语言C++语言是两种不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别。下面将
    的头像 发表于 02-01 10:20 2084次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    一些措施来解决和防止其发生。本文将详细介绍C语言中访问权限冲突异常的原因以及解决方法。 一、访问权限冲突异常的原因分析 访问权限冲突异常可分为两类:访问私有成员和访问未定义成员。下面分
    的头像 发表于 01-12 16:03 5193次阅读

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,结构
    的头像 发表于 01-11 18:24 1273次阅读
    经典 <b class='flag-5'>C</b> <b class='flag-5'>语言</b>编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    结构与指针的关系

    C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构
    的头像 发表于 01-11 08:00 947次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    C语言数据结构之跳表详解

    大家好,今天分享一篇C语言数据结构相关的文章--跳表。
    的头像 发表于 12-29 09:32 797次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>数据<b class='flag-5'>结构</b>之跳表详解

    C语言结构体能不能相加

    C语言中,结构体能不能相加?
    的头像 发表于 12-19 17:04 1221次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中<b class='flag-5'>结构</b>体能不能相加