当前位置: 首页 > article >正文

2024.3.18-408学习笔记-C-结构体

1、结构体

结构体是一种自定义类型。

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。




2、结构体的声明

struct Student
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};//分号不能丢

以上声明的结构体的数据类型是:struct Student,这是一个整体,不能分开。




3、结构体变量的创建和初始化

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

struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex;//性别
    char id[20];//学号
}s0 = {"zero", 0, 'M', "0"},s2;
//结构体全局变量的定义方式1
//结构体全局变量的初始化方式1:按照结构体成员变量的默认顺序初始化


//结构体全局变量的定义方式2
//结构体全局变量的初始化方式1:按照结构体成员变量的默认顺序初始化
struct Stu s1 = {"one", 1, 'M', "1"};


int main()
{

    printf("name: %s\n", s0.name);
    printf("age : %d\n", s0.age);
    printf("sex : %c\n", s0.sex);
    printf("id : %s\n", s0.id);

    printf("name: %s\n", s1.name);
    printf("age : %d\n", s1.age);
    printf("sex : %c\n", s1.sex);
    printf("id : %s\n", s1.id);


    //结构体全局变量的初始化方式2:按照结构体成员变量的指定顺序初始化
    strcpy(s2.name, "two");
    s2.age = 2;
    s2.sex = 'F';
    strcpy(s2.id, "2");

    printf("name: %s\n", s2.name);
    printf("age : %d\n", s2.age);
    printf("sex : %c\n", s2.sex);
    printf("id : %s\n", s2.id);


    //-------------------------------------------------------


    //结构体局部变量的定义方式
    //结构体局部变量的初始化方式1:按照结构体成员变量的默认顺序初始化
    struct Stu s3 = {"three", 3, 'M', "3"};

    printf("name: %s\n", s3.name);
    printf("age : %d\n", s3.age);
    printf("sex : %c\n", s3.sex);
    printf("id : %s\n", s3.id);


    //结构体局部变量的初始化方式2:按照结构体成员变量的指定顺序初始化
    struct Stu s4 = {.age = 4, .name = "four", .id = "4", .sex = 'F'};

    printf("name: %s\n", s4.name);
    printf("age : %d\n", s4.age);
    printf("sex : %c\n", s4.sex);
    printf("id : %s\n", s4.id);


    //结构体局部变量的初始化方式2:按照结构体成员变量的指定顺序初始化
    struct Stu s5;

    strcpy(s5.name, "five");
    s5.age = 5;
    s5.sex = 'F';
    strcpy(s5.id, "5");

    printf("name: %s\n", s5.name);
    printf("age : %d\n", s5.age);
    printf("sex : %c\n", s5.sex);
    printf("id : %s\n", s5.id);


    return 0;
}



4、结构体类型的重命名

typedef struct Student
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}Stu;//将结构体数据类型struct Student重命名为Stu




5、匿名结构体

struct 
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1;

1、匿名结构体类型就是在声明时,省略了标签的结构体数据类型。

2、匿名的结构体类型,如果没有对结构体类型使用typedef进行重命名的话,就只能在声明时定义结构体变量。

3、匿名结构体类型不能进行自引用。




6、结构体类型指针

#include <stdio.h>

typedef struct Node
{
    int data;
}Node, *pNode;



int main()
{
    struct Node *p1 = NULL;//结构体指针定义方法1
    Node *p2 = NULL;//结构体指针定义方法2
    pNode p3 = NULL;//结构体指针定义方法3

    return 0;
}

以上为三种结构体指针局部变量的方法。




7、结构体的自引用

结构体的自引用涉及到数据结构。

匿名的结构体类型是不能进行自引用的。

错误的自引用:

struct Node
{
 int data;
 struct Node next;
};

以上代码是错误的,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷的大,无法用sizeof()操作符获得其大小,是不合理的。



正确的自引用:

struct Node
{
	int data;
	struct Node *next;
};


结构体的自引用时,结构体内部不能使用typedef产生的新命名,即:
错误代码:

typedef struct Node
{
	int data;
	Node *next;
}Node;

正确代码:

typedef struct Node
{
	int data;
	struct Node *next;
}Node;

原因:因为typedef的重命名作用是从新命名Node出现才开始生效的,可是在新命名Node出现前,也就是在结构体内部需要提前使用结构体类型,此时的typedef产生的新命名还未生效,所以在结构体内部不能使用typedef产生的新命名。



结构体的自引用常用于数据结构中对链表节点的构建。

struct Node
{
	int data;//数据域
	
	struct Node *next;//指针域
};

链表节点内部划分为数据域指针域数据域存放本节点所包含的信息,指针域存放指向下个节点的指针。




8、结构体内存对齐





http://www.kler.cn/a/273355.html

相关文章:

  • 高德地图美食
  • Kafka日志记录
  • 矩阵的奇异值分解SVD
  • 优选算法精品——双指针
  • QEMU学习之路(4)— Xilinx开源项目systemctlm-cosim-demo安装与使用
  • Linux中断、软中断、MMU内存映射-深入理解
  • npm和pnpm安装、更换镜像源
  • 转录因子/组蛋白修饰靶基因数据库:Cistrome DB使用教程
  • huawei 华为交换机 配置手工模式链路聚合示例
  • 精准核酸检测(100用例)C卷(JavaPythonC++Node.jsC语言)
  • 深入理解与使用go之配置--实现
  • 京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”
  • 前端结合 react axios 获取真实下载、上传进度
  • NFS性能优化参考 —— 筑梦之路
  • Unity中实现游戏对象逐渐放大的脚本教程
  • FreeRTOS入门基础
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②
  • GEE:为什么在机器学习分类或回归时,提取特征变量后的样本点下载到本地时,数据为空且缺少坐标?
  • AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互
  • 【QCM4490】开机慢
  • C++_day6
  • Qt5.14.2 深入理解Qt多线程编程,掌握线程池架构实现高效并发
  • 【低照度图像增强系列(3)】EnlightenGAN算法详解与代码实现
  • 房产销售平台|基于Spring cloud+ Mysql+Java+ Tomcat的房产销售平台设计与实现(可运行源码+数据库+设计文档)
  • ONLYOFFICE文档8.0全新发布:私有部署、卓越安全的协同办公解决方案
  • 数字创新的引擎:探索Web3的前沿科技和商业模式