结构体笔记

news2025/4/26 20:27:58

 

结构体

C语言中的数据类型:

基本数据类型:char/int/short/double/float/long

构造数据类型:数组,指针,结构体,共用体,枚举

概念:

结构体是用户自定义的一种数据类型,可以是相同的数据类型,也可以是不同的数据类型的集合

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}; //结尾的";"不可省略

*分析:

struct:是结构体的关键字

结构名:满足命名规范

{}:不能省略

数据类型:可以是基本数据类型,也可以是构造数据类型

成员:可以是任意个成员

结构体的声明可以在任意位置,但一般在头文件中

结构体在声明类型时不占用内存空间,当使用结构体类型定义变量时申请空间

结构体的初始化和赋值

间接初始化和赋值

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

};

struct 结构名 变量={数据类型 成员1,...,数据类型 成员n} //按顺序初始化

struct 结构名 变量={.成员1=,...,.成员n=} //不按顺序初始化(用". 成员"+成员对应的数据类型的数据)

输出结构体(结构体变量访问内部成员,通过"."访问)

printf("占位符\n",变量.成员1,变量.成员2,...)

间接初始化练习:

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

struct student
{
    char name[128];
    int age;
    double score;
};   

int main(int argc, const char *argv[])
{
    struct student s1={"张三",24,98};
    struct student s2={"李四",36,87};
    struct student s3={"王五",18,43};
    
    printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);
    printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);
    printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);

    return 0;
}

间接赋值练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
    char name[128];
    int age;
    double score;
};
int main(int argc, const char *argv[])
{
    //间接初始化 
    struct student s1={"张三",24,98};
    struct student s2={"李四",36,87};
    struct student s3={"王五",18,43};                                            
    printf("姓名:%s年龄:%d成绩%lf\n",s1.name,s1.age,s1.score);
    printf("姓名:%s年龄:%d成绩%lf\n",s2.name,s2.age,s2.score);
    printf("姓名:%s年龄:%d成绩%lf\n",s3.name,s3.age,s3.score);

    //赋值方式1
    struct student s4;
    strcpy(s4.name,"牛二");
    s4.age=25;
    s4.score=67;
    printf("姓名:%s年龄:%d成绩%lf\n",s4.name,s4.age,s4.score);

    //赋值方式2
    struct student s5;
    printf("输入学生姓名\n");
    scanf("%s",s5.name);
    printf("输入学生年龄\n");
    scanf("%d",&s5.age);
    printf("输入学生成绩\n");
    scanf("%lf",&s5.score);
    printf("姓名:%s年龄:%d成绩%lf\n",s5.name,s5.age,s5.score);


    return 0;
}

直接初始化和赋值

直接初始化是将变量定义在结构体类型的后面

如果使用直接初始化,可以省略结构名不写

如果省略结构名,则只能使用已有的结构类型变量

格式:

struct 结构名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}

变量1={.成员1=,...,.成员n=},

变量2={.成员1=,...,.成员n=},

变量3={.成员1=,...,.成员n=}

...

练习:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct dog
{
    char name[128];
    int age;
    char color[128];
}d1={.name="小黑",.age=2,.color="白色"},
    d2={.name="小白",.age=2,.color="黑色"},
    d3,
    d4
    ;
void out(struct dog d)
{
    printf("名字:%s年龄:%d毛色:%s\n",d.name,d.age,d.color);
}
int main(int argc, const char *argv[])
{
    out(d1);
    out(d2);
    //赋值方式1
    struct dog d3;
    strcpy(d3.name,"小黄");
    d3.age=25;
    strcpy(d3.color,"黄色");
    out(d3);
                                                                      
    //赋值方式2
    struct dog d4;
    printf("输入姓名\n");
    scanf("%s",d4.name);
    printf("输入年龄\n");
    scanf("%d",&d4.age);
    printf("输入毛色\n");
    scanf("%s",d4.color);
    out(d4);


    return 0;
}

结构体数组

数组:一次性定义多个类型相同的变量

结构体数组:一次性定义多个类型相同的结构体变量

结构体数组的初始化和赋值

间接初始化和赋值

#include <stdio.h>                                                                           
#include <string.h>
#include <stdlib.h>
struct student
{
    char name[128];
    int age;
    int id;
};
void out(struct student *s,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);
    }
}
int main(int argc, const char *argv[])
{
    struct student s[3]={{"张三",18,1008},{"李四",18,1009}};    //按顺序初始化
    struct student s1[3]={[2]={.id=1009,.name="王五",.age=20}};   //不按数据初始化
    out(s,3);
    out(s1,3);
    return 0;
}

直接初始化和赋值

#include <stdio.h>                                                           
#include <string.h>
#include <stdlib.h>
struct student
{
    char name[128];
    int age;
    int id;
}
s[3]={{"张三",23,1010}}
;
void out(struct student *s,int n)
{   
    for(int i=0;i<n;i++)
    {   
        printf("名字:%s 年龄:%d 学号:%d\n",s[i].name,s[i].age,s[i].id);
    }
}
void in(struct student *s,int n)
{
    for(int i=0;i<n;i++)
    {
   printf("输入姓名\n");
    scanf("%s",s[i].name);
    printf("输入年龄\n");
    scanf("%d",&s[i].age);
    printf("输入学号\n");
    scanf("%d",&s[i].id);
    }

}
int main(int argc, const char *argv[])
{   
    out(s,3);
    return 0;
}

结构体指针

结构体指针:存储结构体变量的地址

格式:

struct 结构名 *变量名;

结构指针访问内部变量通过"->"访问

练习:

在栈区中用结构体指针实现结构体元素的输入输出

在堆区中用结构体指针实现结构体元素的输入输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student
{
    char name[128];
    int age;
    int id;
};
void out(struct student *s,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("名字:%s 年龄:%d 学号:%d\n",(s+i)->name,(s+i)->age,(s+i)->id);
    }
}
void in(struct student *s,int n)
{
    for(int i=0;i<n;i++)
    {
   printf("输入姓名\n");
    scanf("%s",(s+i)->name);
    printf("输入年龄\n");
    scanf("%d",&(s+i)->age);
    printf("输入学号\n");
    scanf("%d",&(s+i)->id);
    }

}
int main(int argc, const char *argv[])
{
    struct student s[3];
    struct student *p=s;
    in(p,3);
    out(p,3);                                                                              
    struct student *str=(struct student *)malloc(sizeof(struct student)*3);
    struct student *q=str;
    in(q,3);
    out(q,3);
    return 0;
}

typedef结合结构体

格式:

typedef 直接修饰结构体类型(常用)

typedef struct student

{

int id;

int age;

}stu;

stu s; ---> struct student s

typedef 间接修饰结构体类型

struct student

{

int id;

int age;

};

typedef struct student stu;

stu s; ---> struct student s

typedef 起多个名字

typedef struct student

{

int id;

int age;

}student,*ptr_student;

student s; ---> struct student s

ptr_student p=$s; ---> struct student *p

结构体的嵌套

格式:

typedef struct birthday

{

int year;

int month;

}bir;

typedef struct student

{

char name[128];

int age;

bir b; //嵌套一个结构体

}stu;

stu s = {18,"11",2003,12,12};

结构体的嵌套结构体数组

格式:

typedef struct car

{

double price;

char name[128];

}car;

typedef struct student

{

char name[128];

int age;

car b[3]; //嵌套一个结构体数组

}stu;

stu s = {18,"11",{1,"名字"},{2,"名字"},{3,"名字"}};

结构体字节对齐(字节计算 笔试

结构体各个成员的地址是连续的

结构体变量的地址是第一个成员的地址

64位操作系统,8字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节的整数倍,否则填充空字节

32位操作系统,4字节对齐:

  1. 结构体的总字节大小是各个成员字节的总和,但是需要满足是最宽成员的倍数
  2. 结构体的首地址是最宽成员的倍数
  3. 结构体各个成员的首地址是该成员字节(或该成员字节数大于4则是4)的整数倍,否则填充空字节

共用体

概念:不同或者相同的数据,共用一段内存空间

作用:实现一段内存,存放不同的数据

格式:

union 共用名

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

数据类型 成员4;

......

数据类型 成员n;

}; //结尾的";"不可省略

*分析:

union:是结构体的关键字

共用名:满足命名规范

{}:不能省略

数据类型:可以是基本数据类型,也可以是构造数据类型

成员:可以是任意个成员

共用体的声明可以在任意位置,但一般在头文件中

共用体在声明类型时不占用内存空间,当使用共用体类型定义变量时申请空间

共用体的内存空间是最宽成员的内存大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

全球相机控制面板市场展望与未来增长机遇:预计未来六年年复合增长率CAGR为4.3%

在全球摄影器材和专业影像设备需求增长的背景下&#xff0c;相机控制面板正成为市场的焦点。本文详细分析了全球相机控制面板市场的现状、增长趋势及未来前景&#xff0c;旨在为投资者和业内人士提供深入的市场洞察和指导。 市场概览 据恒州诚思团队研究分析显示&#xff0c;2…

Linux内核 mmap内存映射的实现原理

在Linux内核以及Linux系统编程的时候&#xff0c;经常会碰到mmap内存映射&#xff0c;mmap函数是实现高性能编程的一个关键点。本文详细介绍一下mmap实现原理。 虚拟地址映射物理地址 虚拟地址映射物理地址采用的是页表机制&#xff0c;64位CPU采用的是4级页表。 64位CPU虚拟…

算法板子:堆排序——找出数组中前m个最小元素,包括构造小根堆、查询堆中最小值

基础知识&#xff1a; 堆是一棵完全二叉树&#xff0c;除了最后一层外每一层都是满的&#xff0c;并且最后一层如果有右节点必有左节点堆的节点从1开始编号; 如果一个节点的编号是i&#xff0c;那么该节点的左孩子是2i&#xff0c;右孩子是2i1小根堆中&#xff0c;父节点的值小…

医院影像平台源码,C/S体系结构的C#语言PACS系统全套商业源代码

医学学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据…

B端系统UI个性化设计:感受定制之美

B端系统UI个性化设计&#xff1a;感受定制之美 引言 艾斯视觉作为ui设计和前端开发从业者&#xff0c;其观点始终认为&#xff1a;在当今竞争激烈的商业环境中&#xff0c;B端&#xff08;Business-to-Business&#xff09;系统的设计不再仅仅是功能性的堆砌&#xff0c;而是…

Hakuin:一款自动化SQL盲注(BSQLI)安全检测工具

关于Hakuin Hakuin是一款功能强大的SQL盲注漏洞安全检测工具&#xff0c;该工具专门针对BSQLi设计&#xff0c;可以帮助广大研究人员优化BSQLi测试用例&#xff0c;并以自动化的形式完成针对目标Web应用程序的漏洞扫描与检测任务。 该工具允许用户以轻松高效的形式对目标Web应…

Python | TypeError: ‘function’ object is not subscriptable

Python | TypeError: ‘function’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘function’ object is not subscriptable”这一错误通常意味着你尝试像访问列表、元组、字典或字符串等可订阅&#xff08;subscriptable&#xff09;对象那样去…

短视频矩阵源码技术分享

在当今数字媒体时代&#xff0c;短视频已成为吸引观众和传递信息的重要手段。对于开发者而言&#xff0c;掌握短视频矩阵源码技术不仅是提升自身技能的需要&#xff0c;更是把握行业发展趋势的必然选择。本文将深入探讨短视频矩阵源码的关键技术要点及其实现方法&#xff0c;帮…

文心智能体爆肝网文创作

前言 随着人工智能技术的飞速发展&#xff0c;智能体技术正逐渐渗透到我们生活的方方面面。本文将从博主开发的“爆肝网文小说”智能体入手&#xff0c;探讨智能体技术的概念、开发过程以及其在现代生活中的应用和潜力。 1、零代码开发智能体 1.1、什么是文心智能体 文心智…

使用拉链法实现哈希

开散列 开散列又叫链地址法&#xff0c;首先对关键码集合用散列函数计算散列地址&#xff0c;具有相同地址的关键码归于同一子集合&#xff0c;每一个子集合成为一个桶&#xff0c;各个桶中的元素通过一个单链表链接起来&#xff0c;各链表的头节点存储在哈希表中。 ​ 通过结…

webpack5

webpack5主要是内部效率的优化对比webpack4&#xff0c;没有太多使用上的改动 基本配置 拆分配置和merge module.exports merge(commonConfig, { /** options **/})启动本地服务 在dev中添加配置 devServer: {static: {directory: distPath,},port: 8089,hot: true,compres…

uniapp开发小程序onShow中使用uni.$on监听未消亡Bug

大家好&#xff0c;我是学点&#xff01;在一个键盘打碟鼠标卡点即吵闹又寂静无声的办公大厅&#xff0c;我听到来自领导的呼唤&#xff0c;进入领导办公室后领导说调用第三方接口与我们系统业务不匹配&#xff0c;第三方接口调用量严重超标&#xff0c;调用接口费用一直往上涨…

uniapp小程序中富文本内容渲染图片不展示的问题

文章目录 1.从后端请求的数据中图片是这样的2.前端我是用Uview中的u-parse组件3.这样修改去掉富文本中的所有反斜杠4.完美解决 1.从后端请求的数据中图片是这样的 <p><img src\\\"https://zhangsanfengcode.cn:8084/images/2024-06-28a257befe.jpg\\\" alt…

2.5 C#视觉程序开发实例2----图片内存管理 Csharp实现

2.5 C#视觉程序开发实例2----图片内存管理 Csharp实现 1 目标效果视频 mat-buffer 2 VisionManager类&#xff0c;专门用来管理Opencv相关的内存和 工具参数 2.1 定义一个mat_buffers数组 // Mat buffer 用于保存Mat 图片内存 //Mat[0]:register //Mat[1]:cur img //Mat[2-6…

JSP内置对象及作用域

Request 存东西ResponseSession 存东西Application [ SerlvetContext ] 存东西config [ SerlvetConfig ]out/targetpage 不用了解exception <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>…

从0到1搭建一个组件库

最近我开启了一个新项目&#xff0c;基于echarts进行二次封装&#xff0c;希望能为Vue3项目量身打造一套高效、易用的图表组件库&#xff0c;取名为 v-echarts。 目前雏形已经搭建完成&#xff0c;先把整个搭建过程做一个记录。后续再持续迭代、完善该图表组件库。 v-echarts 文…

微软现在允许开发人员对 Phi-3-mini 和 Phi-3-medium 模型进行微调

今年 4 月&#xff0c;微软首次发布了Phi-3 系列 SLM&#xff08;小型语言模型&#xff09;&#xff0c;该产品具有低成本、低延迟的特性。Phi-3-mini 是一种 3.8B 语言模型&#xff0c;有 4K 和 128K 两种上下文长度。Phi-3-medium 是 14B 语言模型&#xff0c;也有两种上下文…

解决git每次push代码到github都需要输入用户名以及密码

产生原因&#xff1a; 出现以上情况的主要原因在于采用的是 https 方式提交代码&#xff0c; 如果采用的是 ssh 方式只需要在版本库中添加用户的 sha 的key就可以实现提交时无需输入用户名和密码。 解决方法 在终端中使用以下命令删除原先已经建立的http的链接方式&#xff0c…

leetcode-79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…