C语言结构体声明与初始化
保持节奏 人气:0一、结构体声明的结构
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" };
注意:最后一个元素赋值后边加不加逗号都没有问题。
加载全部内容