【C语言】自定义类型的介绍(结构体,枚举,联合体,位段)

本文详细介绍了C语言中的自定义类型,包括结构体、枚举和联合体。结构体是存储不同类型数据的集合,涉及到内存对齐和大小计算。枚举提供了一种命名整数常量的方式,具有比宏更好的可读性和维护性。联合体则允许不同类型的变量共享同一块内存空间,可用于判断计算机的大小端存储。
摘要由CSDN通过智能技术生成

前言

在C语言当中,除了我们常用的几个基本的数据类型之外,还有一种类型叫自定义类型。比如:我们要描述一个学生。这个学生有姓名,性别,年龄,身高等。单独用基本的数据类型是不能完全描述的。这个时候就要使用我们自定义的类型来进行描述。自定义的类型有结构体,枚举和联合体。

一. 结构体

1.1 结构体概述

结构体概念

C语言 数组允许定义可存储相同类型数据项的变量,结构是C语言编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。

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

结构体的声明与使用

结构体的声明与定义

//结构体
struct Stu	//这里的Stu表示标签,不是变量名
{
   
    char name[20];//姓名
    char sex[5];//性别
    char id[20];//学号
    int age;//年龄
    double grade;//成绩
}student;	//变量列表,用来定义变量。注意这里的分号

其中struct Stu是自定义结构体类型,花括号内的一系列数据类型称为结构体成员变量student为定义的结构体类型变量

结构体的不完全声明

//匿名结构体类型
struct
{
   
    int a;
    char b;
    float c; 
}x;

struct
{
   
    int a;
    char b;
    float c;
}a[20], *p;
int main()
{
   
    p = &x; //err
}

上面的两个结构体声明时省略了结构体标签,但是只能跟在结构体声明后创建结构体变量,其他情况下是无法创建该结构体变量的,这也就说明后续无法创建该结构体指针;就算再声明一个成员变量相同的的结构体的指针p,将x的地址赋值给p,编译器会发生报错,因为编译器会将他们当做两个不同类型的结构体处理。

结构体的自引用

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

直接将结构体嵌套在相同结构体是不可取的,你可以想象一下,如果可以这么做,那这个结构体的大小是多少,他会无限制地嵌套下去,导致栈溢出,如果硬是需要嵌套自身,应该嵌套相同结构体类型的指针。(数据结构的链表)

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

在使用typedef定义结构体自引用时,不能直接在结构体中使用typedef替换的结构体类型名直接定义结构体指针,而是应该使用原类型名定义在结构体中定义结构体指针.

//错误示例:
typedef struct NODE
{
   
    int data;
    Node* next; 
}Node;

//正确示例:
typedef struct NODE
{
   
    int data;
    struct NODE* next; 
}Node;

结构体的使用与传参

#include <stdio.h>
struct Stu
{
   
    char name[20];//姓名
    char sex[5];//性别
    char id[20];//学号
    int age;//年龄
    double grade;//成绩
}student;
int main()
{
   
    struct Stu s = {
    "张三","男","20220711",20,90 };//结构体声明与初始化
    //结构体成员访问方式1:结构体变量名.结构体成员名
    printf("姓名:%s\n", s.name);
    printf("性别:%s\n", s.sex);
    struct Stu* ps = &s;
    //结构体访问成员方式2:结构体指针->结构体成员名
    printf
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morning_Yang丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值