c 函数及指针学习 7

时间:2021-02-27 21:14:28

1。结构的存储分配

1
2
printf("%d \n",sizeof(char));
printf("%d \n",sizeof(int));

c 函数及指针学习 7

int 类型为4B char 为1B

1
2
3
4
5
6
7
struct sa
    {
        char a;
        int  b;
        char c;
 
    };

c 函数及指针学习 7

c 函数及指针学习 7

1
2
3
4
5
6
7
8
struct sa
    {
        char c;
        char b;
        int a;
 
    };
struct sa ssa;

c 函数及指针学习 7

1
printf("%d \n",offsetof(struct sa,a));

c 函数及指针学习 7

结构体存储时要注意

要满足字对齐,起始地址为四的倍数,结束为止为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));

c 函数及指针学习 7

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;

位段的功能均可由移位和屏蔽实现。