之前一直搞不懂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实例 永远只能带有一个成员。
sizeof(SizeTest)的结果是24。为什么不是19呢?这跟字节对齐有关,union/struct所占空间的大小都受字节对齐的影响!字节对齐的方式取决于用到的最大的基本数据类型,这里是double占8字节,所以最小的对齐单位是8字节,故而总大小是24字节。如果去掉double则会按int的4字节来对齐,如果只留char类型 则总大小会是19。 2.位域(位字段) 实际编程中union很少用到,位域反而会用到,尤其是在一些对空间要求高的地方,例如网络协议的实现中。 struct BitField {成员的排列顺序直接影响所占空间的大小。 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; 这个语句编译器不一定会提示你有问题,但运行结果一定不是你想要的! |
|