1。结构的存储分配
1
2
|
printf
(
"%d \n"
,
sizeof
(
char
));
printf
(
"%d \n"
,
sizeof
(
int
));
|
int 类型为4B char 为1B
1
2
3
4
5
6
7
|
struct
sa
{
char
a;
int
b;
char
c;
};
|
1
2
3
4
5
6
7
8
|
struct
sa
{
char
c;
char
b;
int
a;
};
struct
sa ssa;
|
1
|
printf
(
"%d \n"
,offsetof(
struct
sa,a));
|
结构体存储时要注意
要满足字对齐,起始地址为四的倍数,结束为止为4 的倍数。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
struct
sa
{
char
a;
char
b;
double
e;
int
d;
};
struct
sa ssa;
printf
(
"%d \n"
,offsetof(
struct
sa,a));
printf
(
"%d \n"
,offsetof(
struct
sa,b));
printf
(
"%d \n"
,offsetof(
struct
sa,e));
printf
(
"%d \n"
,offsetof(
struct
sa,d));
|
2.结构体作函数的参数
部分值传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
struct
sa
{
char
a;
char
b;
double
e;
int
d;
};
char
saf(
struct
sa ssa)
{
return
ssa.a+ssa.b;
}
int
main()
{
char
ra;
struct
sa ssa={1,2,1.1,4};
ra=saf(ssa);
printf
(
"%d \n"
,ra);
}
|
引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
struct
sa
{
char
a;
char
b;
double
e;
int
d;
};
void
saf(
struct
sa *ssa)
{
ssa->a=ssa->a+ssa->b;
}
int
main()
{
struct
sa saa={1,2,1.1,4},*ssa;
ssa=&saa;
saf(ssa);
printf
(
"%d \n"
,ssa->a);
}
|
3位段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
struct
sa
{
unsigned a :1;
unsigned b :2;
signed
e :2;
signed
d :2;
};
int
main()
{
struct
sa saa={1,2,3,4},*ssa;
printf
(
"%d \n"
,
sizeof
(
struct
sa));
printf
(
"%d \n"
,saa.d);
}
|
d占2Bit,给d赋值 4溢出 ,为00,有符号数 结果为0,
给d 赋值 3 溢出,为11,有符号数,结果为-1;
位段的功能均可由移位和屏蔽实现。