c 函数及指针学习 5

时间:2022-09-09 19:26:09

聚合数据类型

能够同时存储超过一个的单独数据。 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个字节的内存空间,上面的程序运行后

c 函数及指针学习 5

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;