1.结构体的两种定义方法和变量的三种声明方法:
#include <iostream> using namespace std; /* 结构体的两种定义方式 */ struct test01{ int a; double b; float c; }; typedef struct { int a ; double b; float c; } test02; int main(int argc, char* argv[]){ /* 结构体变量的三种声明方式 */ struct test01 t; /* 需要struct标签 */ test02 t1; /* 不需要标签 */ struct { int a; double b; float c; } t2; return 0; }
2.结构体成员的访问
#include <iostream> using namespace std; typedef struct { int a; double b[10]; float c; }test_t; int main(int argc, char* argv[]){ test_t t; t.a = 1; /* 结构体使用.访问成员 */ test_t *t1; t1->a = 1; /* 对于指针类型的结构体使用->访问成员 */ (*t1).a =1; /* *运算符优先级低于.,所以需要加括号 */ return 0; }
3.结构体的自引用
#include <iostream> // struct test_t{ // int a; // double b[10]; // float c; // struct test_t t; /* 在结构体中自己的变量是不合法的,因为这个操作会引起无穷的递归 */ // }; struct test_t { int a; double b[10]; float c; struct test_t *t; /* 此处是合法的,因为t只是一个指针,不会引起无穷递归 */ }; typedef struct { int a; double b[10]; float c; test01_t *t; /* 这是一个陷阱, 编译器解释到这一行时,test01_t还没有被定义 */ } test01_t; /* 正确的做法如下 */ typedef struct test02_tag { int a; double b[10]; float c; struct test02_tag *t; } test02_t;
4.结构体的交叉引用,不完整声明
#include <iostream> using namespace std; /* 如果存在两个结构体 A 和 B,它们相互引用,应该如何定义呢? 或者说先定义谁呢?*/ struct B; /* 不完整定义 */ struct A { int a; double b[10]; float c; struct B *b; }; struct B { struct A *a; }; int main(int argc, char *argv[]) { return 0; }