c 函数及指针学习 7

时间:2022-09-09 20:04:51

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;

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