首页 > 其他分享 >c基础 结构体

c基础 结构体

时间:2024-07-26 19:25:30浏览次数:12  
标签:定义 int age 基础 student 结构 struct

结构体 struct

1.结构体基本用法

1.1 定义

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。

使用结构体的好处:

结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。

为函数间传递不同类型的数据提供了方便。

1.2结构体定义格式

struct 结构体名

{

数据类型 成员变量名1;

数据类型 成员变量名2;

数据类型 成员变量名3;

...

};

举例:

struct student
{
    char name[32];
    int age;
    float score;
};
定义了一个名字叫student的结构体数据类型,里面成员有三个分别是name,age和score。

1.3结构体变量 

1.3.1 概念

通过结构体类型定义的变量

1.3.2 定义格式

struct 结构体名 变量名;

1.3.3 定义结构体变量方式

先定义结构体,再定义结构体变量

struct 结构体名

{

成员变量;

};

struct 结构体名 变量名;

例如:

struct student s1;

定义结构体的同时定义结构体变量

struct 结构体名

{

成员变量;

};

1.3.4 结构体变量赋值

先定义一个结构体:

struct student

{

char name[32];

int id;

int age;

};

定义结构体变量时直接使用花括号赋值

struct student s1 = {"xiaoming",1,18};

定义结构体用点等法赋值

struct student s2 =

{

.name ="xiaofang",

.id = 2,

.age =18

};

定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符.

struct student s3;

s3.id=3;

s3.age=19;

strcpy(s3.name, "xiaowang");

1.3.5 访问结构体成员变量

通过.访问: 结构体变量名.成员变量名

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
} s1, s2;     //定义结构体类型student的同时定义结构体变量s1和s2

int main()
{
    struct student s3 = {"xiaoliu", 1, 19};  //用struct student类型定义变量s3的同时给每个成员赋值
    struct student s4 = {
        .name = "xiaozhang",
        .id = 2,
        .age = 18};

    struct student s5;   //先定义结构体变量s5, 然后访问每个成员的方式赋值
    s5.id = 3;
    s5.age = 290;
    strcpy(s5.name, "yaojing");

    printf("%s %d %d\n", s3.name, s3.id, s3.age);
    printf("%s %d %d\n", s4.name, s4.id, s4.age);
    printf("%s %d %d\n", s5.name, s5.id, s5.age);
}

1.4重定义typedef

定义结构体的同时重定义

先定义结构体,然后重定义

2.结构体数组

2.1概念

结构体类型相同的变量组成的数组

2.2 定义格式

定义结构体的同时定义结构体数组

先定义结构体,然后定义结构体数组

struct student

{

int id;

int age;

};

struct student s[5];

2.3初始化

定义结构体数组同时赋值

struct student

{

int id;

int age;

};

struct student s[3] = {

{1, 19},

{2, 20},

{3, 18}};

2.4 结构体数组输入输出(for循环)

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
};

int main()
{
    struct student s[3];

    for (int i = 0; i < 3; i++)
        scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);

    for (int i = 0; i < 3; i++)
        printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}

3.结构体指针

3.1 概念

指向结构体变量的指针

3.2定义格式

struct 结构体名 *结构体指针名;

3.3 结构体指针所指变量的成员赋值

通过指向结构体变量的指针间接的去访问其中的成员:

格式: 指针变量名 -> 成员变量名

p->id =1;

p->age =19;

strcpy(p->name,"li");

或者:(*p).id=2; //不常用

3.4 大小

本质还是指针,8字节。(32位系统4字节)

3.5 结构体结构体

如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量

4结构体大小以及对其原则

4.1 结构体大小可以用sizeof得出

sizeof(struct 结构体名);

或者

sizeof(结构体变量名);

结构体数组: 结构体类型大小*元素个数

sizoef(数组名);

4.2 字节对齐原则

例如:

struct stu

{

char a;

int c;

char b;

}; //sizeof(struct stu) 等于12

struct stu

{

char a;

char b;

int c;

}; //sizeof(struct stu) 等于8

第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。

用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。

4.3 节省空间原则

为了减少空间浪费,把占用空间小的成员集中到一起。

总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。

标签:定义,int,age,基础,student,结构,struct
From: https://blog.csdn.net/2301_80508045/article/details/140710709

相关文章

  • 0基础学嵌入式day01
    一、C语言概述    1、什么是程序        程序是为了解决某些问题或者实现某些功能的一系列有序指令的集合。    2、计算机语言简史        第一代机器语言:由0和1组成的二进制机器码。        第二代汇编......
  • MySQL数据结构和索引
    一、MySQL数据结构InnoDB引擎MySQL默认引擎是InnoDB引擎,这个引擎的主要特点是支持事务和行锁,数据结构2.1二叉树(二叉查找树)二叉树是一种特殊的树,二叉树中每个节点的度都不能大于2,就是说每个节点最多只能有左右两个子节点当我们像二叉查找树储存数据的时候,是安装从大到小(或......
  • 可持久化数据结构
    可持久化数据结构简介分类部分可持久化所有版本都可以访问,但是只有最新版本可以修改。完全可持久化所有版本都既可以访问又可以修改。实际应用几何计算(扫描线),字串处理(合并操作rope),版本回溯,函数式编程。可持久化线段树引入[P3834【模板】可持久化线段树2]首先考虑静态......
  • 【踩坑系列-Docker】基于Alibaba Cloud Linux3基础镜像安装Nginx
    Author:赵志乾Date:2024-07-26Declaration:AllRightReserved!!!1.问题描述    使用AlibabaCloudLinux3作为基础镜像,在其上安装Nginx,对应的Dockerfile内容如下:#指定基础镜像FROMalibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:lat......
  • 【基础算法】高精度算法
    高精度算法高精度加法模板:模板题+详解高精度减法模板:模板题+详解高精度乘法模板模板题+详解高精度除法模板模板题+详解计算机最初、也是最重要的应用就是数值运算。在编程进行数值运算时,有时会遇到运算的精度要求特别高,远远超过各种数据类型的精度范围;有时数......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到最后 1、Web安全相关概念(2周)·熟悉基本概念(SQL注入、上传、XSS、、CSRF、一句话木马等)。通过关键字(SOL注入、上传、XSSC......
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到最后 1、Web安全相关概念(2周)·熟悉基本概念(SQL注入、上传、XSS、、CSRF、一句话木马等)。通过关键字(SOL注入、上传、XSSC......
  • 地理位置相关基础数据
    基础数据LONGITUDE_LATITUDE={"110000":{"name":"北京市","latitude":39.904989,"longitude":116.405285},"110101":{"name":"东城区","latitude":39.917544,"......
  • 数据结构 二叉树 前 中 后 序列
    简单二叉树的遍历如果看完还是不太懂就观看速成视频https://www.bilibili.com/video/BV1Ub4y147Zv/?spm_id_from=333.337.search-card.all.click&vd_source=e5f8765d50fb89ef04eb150bd76075b5引用资料文献链接放到篇尾简单术语解释节点(Node):二叉树中的一个元素,包含值和......
  • 【数据结构与算法】快速排序万字全攻略:hoare版本、挖坑法、前后指针法、优化版、非递
          ......