为什么结构体里面可以定义结构体指针(链表)

问题描述:

在学习链表时,第一次碰见结构体里面包含结构体指针,于是 出现这样一个疑问:
为什么结构体里面可以包含结构体指针呢?
没有定义完结构体为什么就能定义此类型结构体指针呢?

这里其实是搞混了一个概念,数据类型和数据实例

struct S {
	int data1;
	int data2;
	struct S* next;
	struct L* next;
};
int main()
{
	struct S s1;
	s1.data1 = 0;
	s1.next->data1 = 2;//用指针访问是因为之前声明了此结构体
	s1.next->next = &s1;
	return 0;
}

定义一个结构体其实是在声明一个结构体里面的成员,在创建结构体变量的时候相当于创建了结构体内部的变量。而声明是不占空间的,但是创建的变量是占空间的,这里的声明就是声明一个数据类型,而创建的就是实例。
struct S就是声明,而s1就是实例

声明更像是在说,如果要创建结构体,就要创建那么多变量,例如上面的创建的struct S,就是在说,如果要创建struct S类型的变量,那么就要创建两个整形,一个struct S类型的指针,一个struct L类型的指针,如果没有这个结构体,我们一样 可以创建这样两个指针。结构体是我们创建变量更加方便,而且他们是一组不同类型的数据。可以将声明结构体看作一个模板,在创建结构体变量的时候,就会按照模板来创建。

在结构体里面可以声明任何类型的结构体指针,都不会报错,编译器并不会检查是否定义过此类型,甚至像struct L* next,我们没有定义过此类型的结构体,但依然可以创建出来,这里不知道是不是编译器优化了,甚至警告都没有报,但是无法用“->”去访问类型。
个人认为编译器只检查类型,例如整形,指针类型一类的,并不详细检查,毕竟只要知道开辟多大的空间就行。只有在真正创建的时候才去详细检查。
在这里插入图片描述

整个结构体里面的成员和结构体并不冲突,是成员一起构成了结构体,只不过里面多了一个结构体指针类型的成员,他并不指向此结构体,因为只是声明了此结构体,并不占内存。所以也没办法指向谁。
只有创建了一个结构体变量,相当于创建了一个结构体指针,给这个结构体赋什么值,他就指向谁。之前自己一直陷在这个泥潭里面,总觉得创建了一个结构体指针以后,相对应的结构体也被创建了出来,这是因为把结构体指针存,和用结构体指针访问搞混了。

struct S {
	int data1;
	int data2;
	struct S* next;
};
int main()
{
	struct S s1;
	s2.next = 1;
	s2.next->next = 1;
	return 0;
}

结构体指针就是一个指针变量,在32位环境下占四个字节,可以存任何值,编译器将其中的值看作地址,只要没有对非法地址进行写入都没问题。因为本身具有写入属性(自己造的词),就是可以用“->”写入,所以给我了一种错觉,感觉好像在开辟空间。像在链表中,一般会用malloc开辟一个结构体大小的空间才进行写入操作,而开辟的空间里面的变量具有相应的指针属性,个人理解是在强转类型转换那一步进行的。对那个结构体指针来看,就是创建这样一个结构体就要创建一个指向这种结构体的指针。指针指向的数据类型是这种结构,但不一定是自己所在的这个结构。

SLNode* pnewNode = (SLNode*)malloc(sizeof(SLNode));

如有错误,欢迎批评指正。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值