【C语言】自定义类型:结构体(上)

server/2024/10/20 14:30:50/

本篇文章将讲解以下知识点:

(1)结构体类型的声明

(2)结构体变量的创建和初始化

(3)结构体的自引用:

前言:

其实C语言中有内置类型也有自定义类型。

内置类型C语言本身支持的现成的类型。例如:整型(int),浮点型(double  float),字符型(char)

但是仅仅有内置类型是不够的。比如:你描述一本书,书有:价格,书的作者名,等。如果用C语言的内置类型是不能描述的。

C语言允许有自定义的类型。

结构体-------struct

枚举-------enum

联合体-------union

结构体类型

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

(1)结构体的声明

struct    tag

{

   member-list;//结构体的成员,一个或者多个

}variable --list;

tag为名字,variable-list是变量列表

例如;

创建一个学生:

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

(2)结构体变量的创建和初始化

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct  Book
{
    char name[20];
    char author[10];
    float  price;
    char id[13];
};
int main()
{
    //按照结构体成员的顺序初始化
    struct Book  b1 = { "西游记","吴承恩",50.2,"1245521" };
    //按照指定的顺序初始化
    struct Book  b2 = { .author = "曹雪芹",.id = "4557544",.name = "红楼梦",.price = 45.9 };
    return 0;
}

结构体的特殊声明:

在声明结构体的时候,可以不完全的声明

例如://匿名结构体类型

struct
{
    int a;
    char ch;
    float c;
}s = { 100,'x',45.3 };

代码运行:

匿名结构体在声明的时候省略了结构体标签(tag)。

一:

struct    

{

int a;

int b;

float c;

}x;

二:

struct

{
int a;

char b;

float c;

}a[20],*p;

p=&x合法吗?

会报警告,编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。匿名结构体类型,如果没有对结构体重命名的话,基本上只能使用一次。

对匿名结构体重命名:

typedef  struct
{
    char ch;
    int i;
    double d;
}S;
S  s;

(3)结构体的自引用

数据结构---其实是数据在内存中的存储和组织的结构。

在结构体中包含一个类型为该结构体本身的成员是否可以呢?

例如:定义一个链表的节点


struct Node
{
    int data;
    struct Node  ch;
};

上述代码不正确,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷大。

正确的自引用方式:

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

在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型的重命名也容易引入问题。

类型重命名:

1))

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

Node  n2;

2))

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

1))的效果与2))的效果一样


http://www.ppmy.cn/server/133363.html

相关文章

【动手学深度学习】8.2. 文本预处理(个人向笔记)

本节将解析文本的常见预处理步骤包括&#xff1a;将文本作为字符串加载到内存中。将字符串拆分为词元&#xff08;如单词和字符&#xff09;。建立一个词表&#xff0c;将拆分的词元映射到数字索引。将文本转换为数字索引序列&#xff0c;方便模型操作。 1. 读取数据集 我们下…

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…

MYSQL 表对表快速迁移-直接拷贝表空间文件.ibd进行迁移

数据无价&#xff0c;操作前&#xff0c;建议先备份 前提条件 表结构一致&#xff1a; 源数据库和目标数据库中的表结构必须完全相同。这包括表的列定义、索引、约束等。 表使用 InnoDB 存储引擎&#xff1a; 这种迁移方法仅适用于使用 InnoDB 存储引擎的表&#xff0c;因为 .…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义&#xff1a;**将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个可变维度的耦合度。 2.结构&#xff1a; 抽象化角色 &#xff1a;定义抽象类&#xff0c;并包含一个对实现化…

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中&#xff0c;updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别&#xff1a; 一、功能 updateByPrimaryKey&#xff1a; 会根据传入的实体对象&#xff0c;将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…

如何使用Python对Excel、CSV文件完成数据清洗与预处理?

在数据分析和机器学习项目中&#xff0c;数据清洗与预处理是不可或缺的重要环节。 现实世界中的数据往往是不完整、不一致且含有噪声的&#xff0c;这些问题会严重影响数据分析的质量和机器学习模型的性能。 Python作为一门强大的编程语言&#xff0c;提供了多种库和工具来帮…

AWS Aurora 实例更换实战:最小化业务影响的升级策略

在本文中,我们将详细介绍如何在生产环境中安全地更换 AWS Aurora 实例,包括主写实例和只读实例的更换过程。我们的目标是将影响降到最低,同时确保系统的稳定性和性能。 背景 随着业务的增长,我们需要升级现有的 Aurora 实例以提供更好的性能和更大的容量。本次更换涉及主…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…