匿名结构体与结构体的引用

匿名结构体类型 

 

我们知道结构体在声明的时候是:

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;
}

 

懂了就看 

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了!


结构体的引用 

自引用  

 定义:结构体的自引用 ,就是在结构体内部,包含指向自身类型结构体的指针

 //这里如果不是指针的话,那么该结构体就会无限循环下去,造成溢出,并且该结构体类型的大小你也是无法判断的。

举例

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;
}

 //这里的浮点数有一点出入,主要还是与浮点数的存储有关的,可借鉴博主前面的文章。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高居沉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值