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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144553
  • 代码
    +关注

    关注

    30

    文章

    4940

    浏览量

    73116
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29362
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的编程技巧

    一个成员是一个未知大小的数组,适用于动态分配内存并关联一个可变长度的数组。‌ ‌3、匿名结构和联合体‌:C语言允许在结构
    发表于 11-27 06:46

    C语言程序的结构

    ,87LPC764有4KB的Flash ROM,而笔者的程序量只有2KB多点,因而第一个想法是改用C语言作为主要的开发语言,应该不至于导致代码空间不够用。其次,考虑到需要定时功能的模块(或称任务,以下统称任务
    发表于 11-26 08:12

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达
    发表于 11-25 07:48

    C语言结构使用

    型的数据组合。 结构的声明与定义 结构的声明一般形式为: c struct 结构
    发表于 11-12 08:30

    C语言的printf基本用法介绍

    也是代码的一部分,但是它并不会给程序带来任何影响,编译器在编译阶段会忽略注释的内容,或者说删除注释的内容。我在《C语言标识符、关键字和注释》一节中做了详细讲解。 3) money 的输出值并不是
    发表于 11-12 07:04

    提高篇——C语言核心技术(中文版)

    资料是“C编程语言”和“C语言链接库”的完整参考手册。这本书的目的是提供一本方便、可靠的手册,辅助日常的编程工作。本书描述
    发表于 06-13 16:39

    程序设计与数据结构

    《程序设计与数据结构》重点阐述了三大方向内容: 1. C语言学习中的痛点:针对当前工程师在C语言学习中的痛点,如指针函数与函数指针,如何灵
    发表于 05-13 16:45

    深入理解C语言C语言循环控制

    改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种
    的头像 发表于 04-29 18:49 1728次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    C语言的历史及程序介绍

    电子发烧友网站提供《C语言的历史及程序介绍.pdf》资料免费下载
    发表于 04-09 16:10 0次下载

    C语言结构与联合体的深度解析:内存布局与应用场景

    一、基础概念与核心差异 1.1 结构(Struct)的本质 **结构C语言中实现数据封装的
    发表于 04-08 09:18

    SV601187的详细资料合集包括了电路图,原理图和介绍详细资料概述

    纯分享贴,有需要可以直接下载附件获取完整资料! (如果内容有帮助可以关注、点赞、评论支持一下哦~)
    发表于 04-02 14:18

    单片机C语言编程宝典大全,初学必备【强推下载!】

    资料介绍:包含 1. 51单片机入门教程 2. 初学者适用:单片机C语言实例100例(代码及释义) 3. 51单片机C
    发表于 03-14 11:03

    全套C语言培训资料—PPT课件

    全套C语言培训资料,共427页,13个章节:C语言概述、程序的灵魂—算法、数据类型 & 运算符与表达式、顺序程序设计、选择
    发表于 03-12 14:50

    L298N-驱动直流电机和步进电机的详细资料大总结

    电机转速控制电路(PWM信号)主要采用 L298N ,通过单片机的 I/O 输入改变芯片控制端的电平,即可以对电机 进行正反转,停止的操作,输入引脚与输出引脚的逻辑关系图为驱动直流电机和步进电机的详细资料可下载PDF文档![hide] [/hide]
    发表于 02-26 16:02

    深入理解C语言:循环语句的应用与优化技巧

    能让你的代码更加简洁明了,还能显著提升程序执行效率。本文将详细介绍C语言中的三种常见循环结构——while循环、for循环和do...whi
    的头像 发表于 12-07 01:11 1059次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:循环语句的应用与优化技巧