C语言结构体声明与初始化

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C语言结构体声明与初始化

保持节奏   2022-09-27 我要评论

一、结构体声明的结构

1.直接声明

struct tag { 
    member-list;
    member-list;
    member-list;  
    ...
} variable-list;

tag 是结构体类型的标签。

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

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

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

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)。

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

情况一:自包含

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

情况二:互相包含

struct B;    //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

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

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

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

是结构体类型声明;

struct Student student1;

是结构体变量定义;

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

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

二.结构体初始化

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

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};

2.定义时直接赋值

# 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.定义后赋值

 struct STUDENT student1; 
 student1.num = 1207041;

4.指定初始化

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

struct book gift = 
{ 
     .value = 25.99,
     .author = "James Broadfool",
     .title = "Rue for the Toad"
}; 

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们