本文没有提及结构体指针变量,另一篇对其进行了说明:戳这里
结构体类型的定义
struct 结构体名
{
结构体成员表;(变量、指针、数组、结构体、共用体)
};
上面是定义的结构体类型,可以说是一个基础。
在定义结构体类型时,系统并不为结构体类型分配内存空间,只有当定义结构体类型的变量时,系统才为每一个变量分配相应的存储单元。
结构体变量的定义
方法一:
首先定义结构体类型,再用结构体类型定义变量
struct 结构名
{
成员列表
};
struct 结构名 变量名列表;
//在C++中,可以直接:结构名 变量名列表。省略“struct”
方法二:
定义结构体类型的同时定义结构体变量
struct 结构名
{
……
}变量名列表;
方法三:
直接定义结构体变量(一次性使用)
struct
{
成员列表;
}变量名列表;
如果想要在别处定义变量,就必须将"struct{…}"这部分重写。
typedef和结构体
typedef struct 结构名
{
成员列表;
}新名字;
这样,我们就可以用这个 “新名字” 命名结构体变量
typedef struct 结构名
{
成员列表;
}新名字;
新名字 变量名; //一个结构体变量
当然,我们也可以不写 “结构名”。这样也是正确的。
结构体变量的初始化
我们将一个结构体变量定义好时,就可以对其进行初始化了。
给出两种初始化方法,如下实例:
#include <stdio.h>
#include <stdlib.h>
//1.利用上文中的方法二定义结构体变量,并赋初值
struct Books{
char title[50];
char author[50];
char subject[100];
int book_id;
}book={"c语言","RUNOOB","编程语言",123456};
int main(int argc, char *argv[]) {
//2.利用上文方法一定义结构体变量,并赋初值
struct Books book2={"c++","c++作者","编程语言",6789};
return 0;
}
实例给的两种方法是最常用到的。
当然,我们用定义结构体变量的方法三,并类似实例赋初值也是没有问题的。但就像上文强调的,这种用法只是一次性的。
struct{
char title[50];
char author[50];
char subject[100];
int book_id;
}book={"c语言","RUNOOB","编程语言",123456};
【注】:直接访问结构体变量的成员,给其赋初值也可以。只是没有涉及到访问结构体变量的成员,所以暂且略过,下文会详细说到。
访问结构体变量的成员
如果用结构体定义了一个变量,那么结构体中的内容就是结构体变量的成员。那么我们该如何访问呢?
实例一:
#include <stdio.h>
#include <stdlib.h>
struct{
char title[50];
char author[50];
char subject[100];
int book_id;
}book={"c语言","RUNOOB","编程语言",123456};
int main(int argc, char *argv[]) {
printf("%s,%s,%s,%d",book.title,book.author,book.subject,book.book_id);
return 0;
}
我们用 “结构体变量名 . 成员名” 就可访问。
上文提到,用这种方法可以为变量的成员赋值,看如下实例:
#include <stdio.h>
#include <stdlib.h>
struct{
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
int main(int argc, char *argv[]) {
strcpy(book.title,"c语言");
strcpy(book.author,"RUNOOB");
strcpy(book.subject,"编程语言");
book.book_id=123456;
printf("%s,%s,%s,%d",book.title,book.author,book.subject,book.book_id);
return 0;
}
结构体数组的定义
struct studnet
{
......
};
struct student stud[5];
其实,结构体数组的定义和结构体变量的定义差不多,只不过这个变量时数组而已。所以定义结构体变量的方法,在这里也可以使用。
结构体数组的初始化
对于结构体数组,每一个数组元素都包含着结构体中的所有结构体成员。所以初始化时,要初始化到位。
如下面的例子:
struct Book{
char title[50];
int id;
}book[5]={ {"asdf",1}, //数组0号元素,包含着title、id,下面同理
{"你好",2},
{"kkkk",3},
{"www",4},
{"hhh",5}
};
我们定义了一个Book结构体,声明了book数组,并初始化。
初始化好之后,我们可以将值取出。
因为每个数组元素都包含所有的结构体成员,所以有以下取值方法:
printf("%s,%d",book[0].title,book[0].id);
我们可以用访问成员变量的方法为其赋值。