c 函数及指针学习 5
时间:2014-04-29 17:05:12
收藏:0
阅读:395
聚合数据类型
能够同时存储超过一个的单独数据。 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; |
评论(0)