一、结构体声明的结构
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