struct和指向struct的指针之间的区别

时间:2016-02-29 03:41:57

标签: c pointers struct

我试图理解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。有人可以解释一下这两个代码示例之间的区别吗?

4 个答案:

答案 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)

两者都有可能,这就是它们在内存中的显示方式:

案例1

     +----+-----+----------+
  +->|    p     |   value  |      struct swag
  |  +----------+----------+
  |  const char*    float
  |
  |  +----------+
  +--+   swag   |                 struct combination
     +----------+
         swag*

案例2

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

在声明指向它之前必须先声明一个类型,这就是标记{语法的作用。