我试图理解struct和struct之间的区别作为指针。以下是代码示例。
代码示例:
#include<stdio.h>
typedef struct{
const char *description;
float value;
} swag;
typedef struct{
swag *swag;
} combination;
正如你所看到的,这里有两个结构组合。 struct组合有一个指向struct swag的指针。为什么我们不能这样做:
typedef struct{
swag swag;
} combination;
为什么必须是swag *swag
。有人可以解释一下这两个代码示例之间的区别吗?
答案 0 :(得分:0)
第二个例子很好,如果你想做的话。将第一个示例与指针一起使用的原因是有一个swag
结构数组,您可以使用索引访问它。
答案 1 :(得分:0)
易于识别的简单差异是combination
:
在第一种情况下,combination
保持指向swag
的指针,因此combination
的大小为4字节(在32位系统中)事件swag
添加或删除成员。在第二种情况下,combination
保持swag
的值,因此大小为8字节(description
地址的4个字节+ value
类型的4个字节)。当您有许多引用一个combination
实例的swag
个实例时,使用第一种情况将保存内存和内存复制。
在第一种情况下,当您将值分配给combination
实例时,只有4个字节的swag
地址被复制到swag
成员,但在第二种情况下,8个字节是复制。
如果您想要传递swag
左右的值,请使用第一个,如果您想要保留swag
的值,请使用第二个。
BTW:您最好阅读C中的指针以获取更多信息。欢呼:D。
答案 2 :(得分:0)
两者都有可能,这就是它们在内存中的显示方式:
+----+-----+----------+ +->| p | value | struct swag | +----------+----------+ | const char* float | | +----------+ +--+ swag | struct combination +----------+ swag*
+-----------------------+ |+----+-----+----------+| || p | value || struct combination |+----------+----------+| +-----------------------+
案例1的优点是swag*
可能在没有数据时指向NULL
,否则它可能指向某个已分配的结构。在案例2中,它总是必须为完整的swag
结构留出空间。
然而,案例2的优点是不存在特定于为swag
结构分配和释放空间的内存管理问题,因为它始终存在。情况2对于引用的局部性可能更好,因为没有指向解除引用和破坏高速缓存一致性的指针。当两个案例都有数据时,案例2的总空间将会减少;案例1:sizeof(swag) + sizeof(swag*)
;案例2:sizeof(swag)
。
答案 3 :(得分:-1)
您正在尝试创建自引用结构
可以这样做:
typedef struct tagswag{
tagswag *pointerToSwag;
// other menbers
}swag;
然后:
swag sw1,sw2,*ptrSw1,*ptrSw2;
在声明指向它之前必须先声明一个类型,这就是标记{语法的作用。