服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言示例讲解结构体的声明与初始化方法

C语言示例讲解结构体的声明与初始化方法

2023-02-23 16:20保持节奏 C/C++

结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。本文将通过示例为大家详细讲讲C语言中结构体的使用,需要的可以参考一下

一、结构体声明的结构

1.直接声明

?
1
2
3
4
5
6
struct tag {
    member-list;
    member-list;
    member-list; 
    ...
} variable-list;

tag 是结构体类型的标签。

member-list 结构体的元素定义,比如 int i; 或者 float f,或者其他有效的变量定义。注意此处使用“;”结尾。

variable-list 结构体变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。结构体标签和结构体变量可以不必同时出现。

2.使用typedef声明一个新的类型

?
1
2
3
4
5
6
7
typedef struct
{
    int a;
    char b;
    double c;
} Simple_t;
Simple_t u1, u2[20], *u3;

现在可以用Simple_t作为类型声明新的结构体变量。

3.不完全声明

(C99 6.2.5)不完整类型(incomplete types):与对象类型相反,包括那些类型信息不完整的对象类型(incompletely-defined object type)以及空类型(void)。

有时候,必须声明一些相互之间存在依赖的结构,可能是自包含,也可能互相依赖,这时就需要不完全声明。

情况一:自包含

?
1
2
3
4
5
6
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
};

情况二:互相包含

?
1
2
3
4
5
6
7
8
9
10
11
12
13
struct B;    //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

注意:以上两种结构体声明中的元素都是指针指向结构体,没有遇到过不是指针的(理论上也不可行)。

注意:要分清结构体类型声明和变量定义(声明是不会占用内存空间的,而变量定义会占用相应内存空间)。如:

?
1
2
3
4
5
struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
};

是结构体类型声明;

?
1
struct Student student1;

是结构体变量定义;

?
1
2
3
4
5
struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
}student1;

是结构体类型声明的同时定义一个结构体变量。

二.结构体初始化

1.声明(同时定义)时直接赋值

?
1
2
3
4
5
6
7
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};

2.定义时直接赋值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# include <stdio.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];
    int num;
    struct AGE birthday;
    float score;
};
int main(void)
{
    struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
    return 0;
}

注意:STUDENT是结构体类型的标签,而不是结构体变量。

3.定义后赋值

?
1
2
struct STUDENT student1;
student1.num = 1207041;

4.指定初始化

(C99标准)指定初始化(designated initializer),指定部分/全部元素初始化。

?
1
2
3
4
5
6
struct book gift =
{
     .value = 25.99,
     .author = "James Broadfool",
     .title = "Rue for the Toad"
};

注意:最后一个元素赋值后边加不加逗号都没有问题。

到此这篇关于C语言示例讲解结构体的声明与初始化方法的文章就介绍到这了,更多相关C语言结构体声明与初始化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/zyl615110/article/details/125595267

延伸 · 阅读

精彩推荐
  • C/C++C语言container of()函数案例详解

    C语言container of()函数案例详解

    这篇文章主要介绍了C语言container of()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    叨陪鲤8862021-12-18
  • C/C++C语言每日练习之乒乓球比赛问题

    C语言每日练习之乒乓球比赛问题

    这篇文章主要为大家详细介绍了C语言实现乒乓球比赛,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小辉_Super5042022-02-21
  • C/C++C语言实现单词小帮手

    C语言实现单词小帮手

    这篇文章主要为大家详细介绍了C语言实现单词小帮手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    坤sama11082021-08-04
  • C/C++详解C++ 动态库导出函数名乱码及解决

    详解C++ 动态库导出函数名乱码及解决

    这篇文章主要介绍了C++ 动态库导出函数名乱码及解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    luochenlong10412021-07-25
  • C/C++C++使用一个栈实现另一个栈的排序算法示例

    C++使用一个栈实现另一个栈的排序算法示例

    这篇文章主要介绍了C++使用一个栈实现另一个栈的排序算法,结合实例形式分析了C++借助辅助栈实现栈排序算法的相关操作技巧,需要的朋友可以参考下...

    难免有错_10472021-05-09
  • C/C++C++ cin.get用法案例详解

    C++ cin.get用法案例详解

    这篇文章主要介绍了C++ cin.get用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    xusong6402021-12-27
  • C/C++CMake编译中的库文件和头文件链接你了解吗

    CMake编译中的库文件和头文件链接你了解吗

    这篇文章主要为大家详细介绍了CMake编译中的库文件和头文件链接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Jason.Li_00124042022-09-15
  • C/C++C语言中动态内存管理图文详解

    C语言中动态内存管理图文详解

    在编写程序时,通常并不知道需要处理的数据量,或者难以评估所需处理数据量的变动程度,下面这篇文章主要给大家介绍了关于C语言中动态内存管理的相关资...

    烤鸡肉玉米煎饼9362022-12-26