聚合数据类型
能够同时存储超过一个的单独数据。 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;
|