聚合数据类型
能够同时存储超过一个的单独数据。 c语言提供了数组和结构体。
1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h>#include <math.h>void main(){struct { int a; }x,*b;int c[2]={1,2};x.a=1;b=c;printf("%d \n",b[1]);printf("%d \n",x.a);} |
1 2 | warning C4133: '=' : incompatible types - from 'int *' to 'struct *'Linking... |
为了证明,指针变量未初始化时,只分配了指针的4个字节的内存空间,上面的程序运行后

2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h>#include <math.h>void main(){struct { int a; int b; }x;struct { int a; int b; }*b;b=&x;} |
1 | warning C4133: '=' : incompatible types - from 'struct *' to 'struct *' |
即使成员列表完全相同,编译器仍将其当作不同的结构体。
可以这样实现
1 2 3 4 5 6 7 | struct sa{ int a; int b; };struct sa x;struct sa *b;//sa称作标签b=&x; |
还可以这样
1 2 3 4 5 6 7 | typedef struct { int a; int b; }sa;sa x;sa *d;d=&x; |
一般都这么做,可以将其放在一个头文件中。
3
结构的自引用
1 2 3 4 5 | struct sa{ int a; int b; struct sa sb; }; |
1 | error C2079: 'sb' uses undefined struct 'sa' |
结构体的长度是没办法确定的,(产生了无穷的递归)
1 2 3 4 5 | struct sa{ int a; int b; struct sa *sb; }; |
结构体的长度是确定的,指针的长度始终为4个字节
进一步说明了 指针变量和 聚合数据类型名(数组名,结构体名的区别)
1 2 3 4 5 | typedef struct { int a; int b; ss *sb; }ss; |
这么定义是错误的,在结构体内部ss还未定义。
应该这么定义
1 2 3 4 5 | typedef struct sa{ int a; int b; struct sa *sb; }ss; |
浙公网安备 33010602011771号