分享

typedef 和 struct相关全解

 社交力学 2012-02-13
 
之前一直搞不懂typedef struct,很烦...
终于彻底搞懂了:https:///questions/612328/difference-between-struct-and-typedef-struct-in-c。这是一个老的C语言的遗留问题

typedef struct 的用法是在C语言中!
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;(不用typedef的话必须这样定义变量)
若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;
这是C语言的语法规定。即是说 NODE是struct node的一个别名,代表这个类型。同理,“typedef struct node{} *pNODE;”中pNODE是struct node*的一个别名,表示指向结构体node类型的指针类型,“pNODE pnode;”
当然在定义的时候可以省去node,typedef struct {} NODE。
 
在C++中完全没有这么复杂!C++中结构体是完全看做类的(用类的方法来使用)。例如:struct node {};  定义对象时:node n;  定义指向node的指针时:node* pnode;
 
在C++中如果使用上述C的语法(基本不用这些)会有所不同:
struct Student
{
int a;
}stu1;//stu1是一个变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;


typedef的用法详解:http://www.360doc.com/showweb/0/0/225130460.aspx


struct相关的其他疑难
1.union
我们常管union叫联合体,实际上叫共用体更贴切一些!union内部可以定义多个成员,但这些成员是互斥的,也就是说对于每一个union实例 永远只能带有一个成员。
  1. union SizeTest{  
  2.         int a;  
  3.         double b; 
            char c;
            char str[19]; 
  4. }; 
union其实很好理解,就是分配一块内存,内存的大小以最大的成员的长度为准,所有成员指向的是同一个地址(即都指向这块内存,也即操作a就是操作b也是操作c)。
sizeof(SizeTest)的结果是24。为什么不是19呢?这跟字节对齐有关,union/struct所占空间的大小都受字节对齐的影响!字节对齐的方式取决于用到的最大的基本数据类型,这里是double占8字节,所以最小的对齐单位是8字节,故而总大小是24字节。如果去掉double则会按int的4字节来对齐,如果只留char类型 则总大小会是19。

2.位域(位字段)
实际编程中union很少用到,位域反而会用到,尤其是在一些对空间要求高的地方,例如网络协议的实现中。
struct BitField
  {
long long a:3;
unsigned
char b:5; unsigned char c:5;
unsigned int d:3;
unsigned int e:3;
unsigned int f:3;
 };
成员的排列顺序直接影响所占空间的大小。

2.1 使用位域时也要注意字节对齐问题!
struct是从上到下依次去对成员进行对齐的,这里是8字节对齐,a、bcde、f共24字节。

2.2 位的分配受前面的数据类型影响!
b占了一个char的大部分,所以c不能跟它放在同一个字节中,它们会各占一个字节。
d只占一个int的3位,e也是如此,所以d、e可以放到同一个int中。
char c:12;这会报编译错误。

2.3 还要注意赋值时不要超过指定的宽度!
e = 16; 这个语句编译器不一定会提示你有问题,但运行结果一定不是你想要的!







    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多