结构体
结构体的声明
结构的基础知识
结构是一些值的集合,这些值为成员变量。结构的每个成员变量可以是不同的类型。
结构的声明
Struct tag //此处的tag为结构体的标签
{
member-list;
}variable-list;
结构体的定义:
比如,定义一个书的结构,书是不是需要有?书名,书号,作者,价格。
struct Book
{
char name[20];
char id[20];
char author[20];
int price;
}sb1,sb2,sb3;//此处创建的为结构体的全局变量
//此处的sb1,sb2为struct Book类型的变量。
int main()
{
struct Book sb4 ;//此处为局部变量。
return 0;
}
匿名结构体类型
struct
{
char c;
int i;
char arr[];
}sb1;
//此处的匿名结构体只能创建全局变量。
此处需要注意的是:
匿名结构体使用的时候只能使用一次,否则会出现下面的现象
struct
{
char name[20];
char id[20];
char author[20];
int price;
}sb1,sb2,sb3;
struct {
char name[20];
char id[20];
char author[20];
int price;
}sb1,sb2,sb3;
虽然这两个匿名结构体看起来一样。
但是编译器认为上面的两个声明为不同的两个类型。
所以是非法的。
结构体的自引用
结构体自引用的方式:
struct Node
{
int data;
struct Node* n;
};
结构体类型的重命名
typedef struct Node
{
int data;
struct Node* next;
}Node;
//给typedef struct Node这个
类型重新起名字 Node
int main()
{
Node n;
//此时可以省略struct。
return 0;
}
但是重命名的时候,结构体里面自引用时这个struct不能省略,否则编译器不会运行通过。
结构体的定义和初始化
结构体是什么我们已经大概了解了,接下来我们需要知道结构体如何去初始化。
结构体创建的同时可以顺便创建变量,就是我们上面提到的创建结构体全局变量。
在我们创建结构体变量的同时也可以为其赋值
#include<stdio.h>
struct Book
{
char name[20];
char id[20];
char author[20];
int price;
}sb1 = { "《c语言结构体》","1345","zhangsan",15 };
//此时就可以为我们的结构体赋值
int main()
{
struct Book sb4 = { "《c语言》","1385","lisi",45 };
//我们也可以在创建局部变量时进行初始化。
printf("%s %s %s %d\n", sb1.name, sb1.id, sb1.author, sb1.price);
printf("%s %s %s %d", sb4.name, sb4.id, sb4.author, sb4.price);
}
?结构体嵌套
#include<stdio.h>
struct Book
{
char name[20];
char id[20];
char author[20];
int price;
};
struct Bookstore
{
char Bookstore_name[20];
char address[20];
struct Book b;
}sb1 = { "好东西书店","南新街包子店对面 ","《c语言结构体》","1345","zhangsan",15 };
int main()
{
struct Book sb4 = { "《c语言》","1385","lisi",45 };
printf("%s %s %s %d\n", sb1.Bookstore_name ,sb1.address,sb1.b.name, sb1.b.id, sb1.b.author, sb1.b.price);
printf("%s %s %s %d", sb4.name, sb4.id, sb4.author, sb4.price);
}
结构体的知识目前就在这里,过后还会有关于结构体内存对齐的方法。?
|