匿名结构体类型
我们知道结构体在声明的时候是:
struct book//struct book 就是你定义的结构体类型
{
char name[20];
short price;
}b1,b2;//定义的两个全局的该结构体类型变量
这里的struct 是结构体关键字,struct book 连在一起就是你定义的结构体类型。 那么把 book 省略的话,又是个啥呢?
匿名结构体类型:
struct//省略结构体标签,不完全声明
{
char name[20];
short price;
}s1, s2;
通过匿名结构体类型只可以使用一次,之后就不可以再次使用,也就是说:
struct { char name[20]; short price; }s1; int main() { struct s2 = { "活着",40 };// return 0; }
以上创建的变量中 s1 就可以实现,而 s2变量的创建就是不合理的,因为匿名结构体类型名是“匿名的”,struct 并不是匿名结构体的类型名,所以这样创建出的局部变量 s2 是行不通的,所以说使用匿名结构体类型创建出来的变量都是全局变量。
//如果你想对匿名结构体类型进行 typedef 重命名再创建变量的话那就是可以的了。
typedef struct
{
char name[20];
short price;
}S;
int main()
{
S s2 = { "活着",40 };//
return 0;
}
懂了就看 ![](https://img-blog.csdnimg.cn/9b77a80c4ef34ff5826e024cd23099c8.png)
struct
{
char name[20];
short price;
}s1;//匿名结构体变量
struct
{
char name[20];
short price;
}*p;//匿名结构体指针
int main()
{
p = &s1;
return 0;
}
//这个编译有问题嘛?
匿名结构体类型其实是不可以这样使用的,毕竟是匿名的,没有确定的类型名,所以编译器会将这两个变量的类型看做是不同的类型。
//所以说如果你想创建一个一次性的结构体类型的话,就可以使用匿名结构体类型创建变量。
补充
struct
{
char name[12];
short price;
}s1;
int main()
{
s1.price = 40;
s1.name = "活着";//可以吗?
return 0;
}
这里咱可不能这样弄哈,你见过那个字符数组是可以这样赋值的呀?一般是在创建的时候就已经赋值好了,如果想单独赋值,就要像下面一样:
strcpy(s1.name, "活着");
这样就OK了!
结构体的引用 ![](https://img-blog.csdnimg.cn/0fdda15cdefe4fd1bb63648fae569d1e.png)
自引用
定义:结构体的自引用 ,就是在结构体内部,包含指向自身类型结构体的指针。
//这里如果不是指针的话,那么该结构体就会无限循环下去,造成溢出,并且该结构体类型的大小你也是无法判断的。
举例
struct test
{
int a;
struct test* p;
};
int main()
{
struct test s2;
struct test s1 = { 12, &s2 };
//等价于 s1.p = &s2 使得s1与s2建立联系
s2.a = 21;
s2.p = NULL;//置空
printf("%d %d", s1.a, s1.p->a);//s1.p 就是 &s2
return 0;
}
相互引用
定义:结构体的相互引用,就是说在多个结构体中,都包含指向其他结构体的指针。
举例
struct test1
{
int a;
char b;
};
struct test2
{
float c;
struct test1 d;//引用struct test1 类型
};
int main()
{
struct test2 m = { 32.7f,{100,'C'} };
printf("%f %d %c", m.c, m.d.a, m.d.b);
return 0;
}
//这里的浮点数有一点出入,主要还是与浮点数的存储有关的,可借鉴博主前面的文章。