linux中c语言结构体详解,linux C语言结构体

timg?image&quality=80&size=b9999_10000&sec=1532916110&di=4947d07d2456caefff7ea9ef09ce4c65&imgtype=jpg&er=1&src=http%3A%2F%2Fimg2.mukewang.com%2F5567d48300010ba306000338.jpg

再学C语言,复习&笔记。

更多Linux知识:

一天一点linux

预处理

编译的四个步骤:.c文件—>.i文件(预处理)->.s文件(编译)->.o文件(汇编)->可执行文件(链接)

gcc -o helloWorld.i helloWorld.c -E

-E表示只让helloWorld.c进行预处理

结构体

结构体对象所占的空间大小涉及到一个字节对齐的问题。字节对齐的目的是让计算机快速读写,是一个以空间换取时间的方式。

结构体对象的大小 = 最后一个成员的偏移量 + 最后一个成员变量的大小 + 填充字节

结构体字节对齐准则:当前成员的偏移量必须是成员变量大小的整数倍,不是的话在后面填充字节。

最后还要判断结构体大小是不是成员中最大成员类型的整数倍,不是的话还需填充。

例:

1

2

3

4

5struct data{

int a;

char b;

int b;

};

a 4字节,b 1字节,c 4字节

计算方法:

a的长度为4,为b的长度1的整数倍,故b的偏移量4字节。

b的偏移量+b的长度=5字节,但5不能整除c的长度(4字节),故需填充偏移量到8字节。所以c的偏移量为8。

c的偏移量+c的长度=8+4=12字节,且12字节是最大成员类型(4字节)的整数倍,故结构体所占空间为12字节。

注:C语言结构体和C++结构体定义的区别

C结构体中只能自定义数据类型,不允许有函数。C++结构体可以加入成员函数,且允许该函数是虚函数。所以C结构体没有构造函数、析构函数和this指针。

C结构体对内部成员变量的访问权限只能是public,C++结构体默认是public,可以是public,protected,private三种。

C结构体不可继承,C++结构体可以从其它结构体或类继承。

以上是表面区别,实际区别是面向过程和面向对象编程思路的区别:C的结构体只是把数据变量给包裹起来了,并不涉及算法。C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。

C语言中没有类的概念,但可通过结构体内创建函数指针实现面向对象思想。

声明定义有区别:1

2

3

4

5struct weapon

{

int price;

int atk;

};

C语言用struct weapon a;

C++可以直接 weapon a;

若C也希望直接声明,则需引入typedef,定义为:

1

2

3

4

5typedef struct weapon

{

int price;

int atk;

}Wea;

Wea a;

共用体

共用体的作用就使不同的类型的变量共享同一个地址,好处是节省开销,缺点是同一时刻仅仅能存储一个成员。

共用体的大小是所有成员中占内存最长的长度,初始化时只能有一个常量。

动态数据结构

静态链表

每一个结点都是在程序中定义的而不是临时开辟的。

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

26

27

28

29

30

31#include

struct weapon

{

int price;

int atk;

struct weapon \*next; //指向下一个节点

};

int main()

{

struct weapon a,b,c,\*head;

a.price = 100;

a.atk = 100;

b.price = 200;

b.atk = 200;

c.price = 300;

c.atk = 300;

head = &a;

a.next = &b;

b.next = &c;

c.next = NULL;

struct weapon \*p;

p = head;

while(p != NULL)

{

printf("%d, %d\n", p->atk, p->price);

p = p->next;

}

}

动态链表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

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41#include

#include

struct weapon

{

int price;

int atk;

struct weapon \*next;

};

struct weapon * create()

{

struct weapon * head;

struct weapon * p1, *p2;//p1当前结点,p2上一个结点

int n = 0;//记录链表长度

p1 = p2 = (struct weapon*)malloc(sizeof(struct weapon));

scanf("%d,%d",&p1->price,&p1->atk);

head = NULL;

while(p1->price!=0)//约定价格为0时停止输入

{

n++;

if(n == 1)

{

head = p1;

}

else

{

p2->next = p1;

}

p2 = p1;

p1 = (struct weapon*)malloc(sizeof(struct weapon));

scanf("%d,%d",&p1->price, &p1->atk);

}

}

int main()

{

struct weapon *p;

p = create();

printf("%d,%d",p->price,p->atk);

return 0;

}

注:更多数据结构知识请参阅《数据结构(C语言版)》。

递归与递推

递归:将一个问题规模为n的问题降为规模为(n-1)的问题,然后依次降低规模(层层往下),直至问题得到低规模的解,之后依次带入高规模的问题中(层层往上),最终得到规模为n解。从n -> 1 -> n。

递推:先构造解决一个低的规模问题,然后依次(层层往上)推导出高规模的问题解。

从1 -> n。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值