自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

成长的博客

分享自己所学

  • 博客(93)
  • 收藏
  • 关注

原创 二、开发环境的搭建

2.1、如何选择合适的开发环境2.1.1、开发环境要素(1)编辑器(2)编译器 MSVC(windows平台下) MinGW GNU(gcc g++) (Linux平台下)(3)辅助(调试器、反编译、代码提示与补全等)2.1.2、选择IDE的考量因素(1)是否能用(满足需求),是否可用(能拿到),是否好用(顺手舒服)(2)是否可跨平台(3)是否需要版权和付费(4)目标项目是大项目还是小项目2.1.3、选择IDE的策略(1)学习时,选最主流的,其他的最好也试试用一下体验体验(2)

2021-11-07 15:25:57 845

原创 一、C++介绍

1.1、为什么有了C还需要C++C++是由C进化而来:(1)C++最早叫:带类的C,最开始只是在C上扩展了class等少量特性,后来不停发展;(2)C++比C语法上复杂很多,语言特性多很多,用好 C++比用好C要难;(3)C++和C面向的场景不同。C更多是OS内核、底层硬件驱动等,C++是功能中间层;C++为什么没有完全取代C:(1)C语言有大量成熟代码和成熟开发者,历史优势大;(2)C++的编译器效率比C编译器低;(3)C在很多场景下完全够用,没必要用C++,譬如MCU软件开发;C++并

2021-11-07 15:06:36 3282 1

原创 1、VXWORKS的中断服务程序

1.1 设置中断程序VxWorks提供函数intConnect(),它允许将指定的C函数与任意中断相联系。函数原型是:STATUS intConnect( VOIDFUNCPTR * vector, //要联系的中断向量 VOIDFUNCPTR routine, //中断发生时要调用的函数 int parameter //传递给中断处理函数的参数 )该函数将指定的C函数routine与指定的中断向量vector相联系,函数的地址将存储在这个中断向量里。所以当中断

2020-11-05 21:06:22 1765

原创 1、系统编程的概念

无论何时,只要执行了系统调用或者库函数,检查调用的返回状态以确定调用是否成功,这是一条编程铁律。1.1.1、系统调用这是系统调用的一个过程;1.1.2库函数(1)有些库函数不会使用任何的系统调用,有些库函数是构建于系统调用层之上的,设计库函数是为了提供比底层系统调用更为方便的调用接口。(2)GNU C语言库函数(glibc)是Linux上最常用的实现。1.1.3处理来自系统调用和库函数的错误(1)几乎每个系统调用和库函数都会返回某类状态值,用以表明调用成功与否。要了解调用是否成功,必须坚持对

2020-10-27 11:25:31 343

原创 2、文件操作的主要接口API

1.1 什么是应用编程(1)典型的嵌入式产品就是基于嵌入式Linux操作系统来工作的。典型的嵌入式产品研发过程是:第一步让Linux系统在硬件上跑起来(系统移植工作),第二步基于Linux系统来开发应用程序实现产品功能。(2)基于Linux去做应用编程,其实就是通过调用Linux的系统API来实现应用需要完成的任务。(3)熟悉Linux系统的API(《Unix高级编程》),进程和线程,文件的读写,操作系统的基本原理。(4)这里一定要弄清楚一些基本的概念,因为我们编写应用程序不一定是在Linxu操作系

2020-10-26 10:39:59 254 1

原创 9-15不带头节点的单链表的相关操作与实现

#include<stdlib.h>#include<stdio.h>#include<string.h>#define DBG(...) fprintf(stderr,"DBG(%s,%s(),%d):",__FILE__,__FUNCTION__,__LINE__); fprintf(stderr,__VA_ARGS__)//创建单链表的节点typedef struct Node{ int data; //数据域 struct No

2020-10-25 14:48:49 166

原创 10-3 像编译器一样思考吧

10.3.1 语法是什么?语法就是编译器的习性(1)编译器反应在编程中就是语法。你对编译器的了解程度就反应在你对语法的理解程度。语法(规则)的理解是永无止境的。就像下象棋,规则很简单,关键就在于你对规则的灵活运用。你越善于运用规则,那么你就越强。学会一门语言后,应该进行项目实践,然后在项目实践中去体会C语言的语法规则。譬如:int i; !!i;解析:!在C语言中是逻辑取反的意思,逻辑取反意思就是0取反就是1,不是0的数取反就是0.问题:让你用C语言编程实现:如果一个数i是0则返回0,如果不是

2020-10-23 16:56:25 769 2

原创 10-2 程序员、编译器、CPU之间的三角恋

10.2.1 CPU只认识二进制机器指令(1)CPU是最终干活的,而CPU只认识只接受二进制。10.2.2 人类喜欢符号而不是二进制(1)人类的大脑本身不喜欢二进制而喜欢符号、文字。(2)人类和机器之间天生有代沟,于是乎编程不容易。10.2.3 连接人(程序员)与机器(CPU)的桥梁:编译器(1)编译器降低了编程难度。编译器的代表就是编程语言,每一种编程语言都有对应的编译器,这个编译器的作用就是把这种语言的源文件编译成可执行程序。(2)关键是:有了编译器(高级语言)之后,我们程序员就不再盯着

2020-10-23 16:56:07 639 1

原创 10-1 编程工作的演进史

十、程序员和编译器之间的暧昧10.1.1 CPU需要的只是1和0组成的二进制数据(1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的。CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的。(2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的,也可以是用汇编语言编写最终编译得到的;也可以是用C语言编写最终编译得到的;也可以是用Java、C#、php、bash等语言编写然后解释得到的;(3)编程工作的

2020-10-22 13:33:48 123

原创 9-14 多线程简介

9.15.1 操作系统下的并行执行机制(1)并行就是说多个任务同时被执行。并行分微观上的并行和宏观上的并行。(2)宏观上的并行就是从长时间段(相对于人来说)来看,多个任务是同时进行的;微观上的并行就是真的在并行执行。(3)操作系统要求实现宏观上的并行。宏观上的并行有2种情况:第一种是微观上的串行,第二种是微观上的并行。(4)理论上来说,单核CPU本身只有一个核心,同时只能执行一条指令,这种CPU只能实现宏观上的并行,微观上一定是串行的。微观上的并行要求多核心CPU。多核CPU中的多个核心可以同时微观

2020-10-22 13:20:26 61

原创 9-13什么是状态机

9.13.1 有限状态机(1)常说的状态机是有限状态机FSM。FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能够从外部接收信号和信息输入,机器在接收到外部输入的信号后会综合考虑当前自己的状态和用户输入的信息,然后机器做出动作:跳转到另一个状态。(2)考虑状态机的关键点:当前状态、当前输入、下一个状态;9.13.2 两种状态机:Moore型和Mealy型(1)Moore型状态机:输出只与当前状态有关(与输入信号无关)。相对简单,考虑状态机的下一个状态时只需要考虑它的当前状态就行了。

2020-10-22 13:20:10 322

原创 9-12 内核链表的基本算法和使用简介

9.12.1 内核链表的节点创建、删除、遍历等这个自己去看内核源代码;9.12.2 内核链表的使用实践(1)问题:内核链表只有纯链表,没有数据区域,怎么使用?(2)设计的使用方法是将内核链表作为将来整个数据结构的结构体的一个成员内嵌进去。struct driver{ char name[20]; //驱动名称 int id; //驱动id编号 struct driver_info info; //驱动信息 struct list_head head; //内嵌

2020-10-22 13:19:34 65

原创 9-11 Linux内核链表

9.11.1 前述链表数据区域的局限性(1)之前定义数据区域时直接int data;我们认为我们的链表中需要存储的是一个int类型的数。但是实际上现实编程中链表中的节点不可能这么简单,而是多种多样的。(2)一般实际项目中的链表,节点中存储的数据其实是一个或者多个结构体+一些基础类型变量,这个结构体中包含若干个成员,这些成员加起来构成了我们的节点数据区域。9.11.2 一般性解决思路:数据区封装为一个结构体(1)因为链表实际解决的问题是多种多样的,所以内部数据区域的结构体构成也是多种多样的。这样也导

2020-10-22 13:19:17 58

原创 9-10 双链表的算法之删除节点

//删除节点int delete_node(struct node *pHeader,int data){ struct node *p = pHeader; while(NULL != p->pNext) { p = p->pNext; //判断当前节点是不是我们要删除的那个节点 if(data == p->data) { //是尾节点 if(NULL == p->pNext) {

2020-10-22 13:18:59 163

原创 9-9 双链表的算法之遍历节点

(1)双链表是单链表的一个父集。双链表中如果完全无视pPrev指针,则双链表就变成了单链表。这就决定了双链表的正向遍历(后向遍历)和单链表是完全相同的。(2)双链表中因为多了pPrev指针,因此双链表还可以前向遍历(从链表的尾节点向前面依次遍历直到头节点)。但是前向遍历的意义并不大,主要是因为很少有当前到了尾节点需要前向遍历的情况。(3)总结:双链表是对单链表的一种有成本的扩展,但是这个扩展在有些时候意义不大,在另一些时候意义就比较大。因此在实践用途中要根据业务要求选择适合的链表。//后向遍历voi

2020-10-22 13:18:36 192

原创 9-8 双链表的算法之插入节点

9.8.1 尾部插入//将新节点插入到链表的尾部void insert_tail(struct node *pHeader,struct node *newNode){ //第一步先走到链表的尾节点 struct node *p = pHeader; while(NULL != p->pNext) { p = p->pNext; } //第二步:将新节点插入到原来的尾节点的后面 p->pNext = newNode; newNode->p

2020-10-22 13:18:12 234

原创 9-7 双链表的引入和基本实现

9.7.1 单链表的局限性(1)单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向连接。链表中的各个节点内存不相连,有利于利用碎片化的内存。(2)单链表各个节点之间只有一个指针单向连接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就比较麻烦(算法就比较有局

2020-10-22 13:17:37 100

原创 9-6 单链表的算法之逆序

9.6.1 什么是链表的逆序(1)链表的逆序又叫反向,意思就是把链表中所有的有效节点在链表中的顺序给反过来。9.6.2 单链表逆序算法分析(1)当我们对一个数据结构进行一个操作时,我们就需要一套算法。这就是数据结构和算法的关系。(2)我总结:算法有2个层次。第一个层次是数学和逻辑上的算法;第二个层次是用编程语言来实现算法。(这就启示我们要去锻炼自己的逻辑思维,要想到怎么去解决这个问题,有解决问题的思路,第二个就是锻炼我们的编程功底,能用代码去实现这个解决问题的思路)。(3)从逻辑上来讲,链表的逆序

2020-10-22 13:17:14 363

原创 9-5 单链表的算法之删除节点

9.5.1 为什么要删除节点(1)一直在强调,链表到底用来干嘛的?(2)有时候链表节点中的数据不想要了,因此要删掉这个节点。9.5.2 删除节点的2个步骤(1)第一步:找到要删除的节点;第二步:删除这个节点;9.5.3 如何找到待删除的节点(1)通过遍历来查找节点。从头指针+头节点开始,顺着链表依次将各个节点拿出来,按照一定的方法比对,找到我们要删除的那个节点。9.5.4 如何删除一个节点(1)待删除的节点不是尾节点的情况:首先把待删除的节点的前一个节点的pNext指针指向待删除的节点的后一

2020-10-21 22:08:06 589

原创 9-4 单链表的算法之遍历节点

9.4.1 什么是遍历(1)遍历就是把单链表中的各个节点挨个拿出来,就叫遍历。(2)遍历的要点:一是不能遗漏,二是不能重复,追求效率。9.4.2 如何遍历单链表(1)分析一个数据结构如何遍历,关键是分析这个数据结构本身的特点。然后根据本身特点来制定它的遍历算法。(2)单链表的特点就是由很多个节点组成,头指针+头节点为整个链表的起始,最后一个节点的特征是它内部的pNext指针值为NULL。从起始到结尾中间由各个节点内部的pNext指针来挂接,由起始到结尾的路径有且只有一条。单链表的这些特点就决定了它

2020-10-21 21:54:45 1154

原创 9-3 单链表的算法之插入节点

9.3.1 继续上节,访问链表中各个节点的数据(1)只能用头指针,不能用各个节点自己的指针。因为在实际当中我们保存链表的时候是不会保存各个节点的指针的,只能通过头指针来访问链表节点。(2)前一个节点内部的pNext指针能帮助我们找到下一个节点。9.3.2 将创建节点的代码封装成一个函数(1)封装时的关键点就是函数的接口(函数参数和返回值)的设计。//作用:创建一个链表节点//返回值:指针,指针指向我们本函数新创建的一个节点的首地址struct node * create_node(int da

2020-10-21 21:24:23 481

原创 9-2 单链表的实现

9.2.1 单链表的节点构成(1)链表是由节点组成的,节点中包含:有效数据和指针。(2)定义的struct node只是一个结构体,本身并没有变量生成,也不占用内存。结构体定义相当于为链表节点定义了一个模板,但是还没有一个节点,将来在实际创建链表时需要一个节点时用这个模板来复制一个即可。9.2.2 堆内存的申请和使用(1)链表的内存要求比较灵活,不能用栈,也不能用data数据段。只能用堆内存。(2)使用堆内存来创建一个链表节点的步骤:1、申请堆内存,大小为一个节点的大小(检查申请结果是否正确);

2020-10-21 21:05:59 276

原创 9-1 链表的引入

九、链表&状态机&多线程9.1.1 从数组的缺陷说起(1)数组有2个缺陷,一个是数组中所有元素的类型必须一致;第二个是数组的元素个数必须事先指定并且一旦指定之后不能更改。(2)如何解决数组的2个缺陷:数组的第一个缺陷靠结构体去解决。结构体允许其中的元素的类型不相同,因此解决了数组的第一个缺陷。所以说结构体是因为数组不能解决某些问题所以才发明的。(3)如何解决数组的第二个缺陷?我们希望数组的大小能够实时扩展。譬如我刚开始定了一个元素个数是10,后来程序运行时觉得不够因此动态扩展为20.

2020-10-21 21:05:28 79

原创 8-8程序调试的debug宏

8.8.1 程序调试的常见方案:单步调试、裸机LED调试、打印信息、log文件(1)利用调试器进行单步调试(譬如IDE中,Jlink)适用于新手,最大的好处就是直观,能够帮助找到问题。缺点是限制性大、速度慢。(2)裸机使用LED、蜂鸣器等硬件调试,适合单片机裸机程序;(3)printf函数打印调试,比较常用,作为程序员必须学会打印调试。好处是具有普遍性,几乎在所有的情况下都能用。(4)log文件(日志文件)是系统运行过程中在特定的时候打印一些调试信息,日志文件记录下来这些调试信息以后以供后续查找追查

2020-10-21 21:05:00 171

原创 8-7顺序结构

8.7.1 最浅显的顺序结构:三种结构之一(1)代码执行的时候如果没有遇到判断跳转或者循环,默认是顺序执行的。执行完上一句则开始执行下一句。(2)顺序结构说明CPU的工作状态,就是以时间轴来顺序执行所有的代码语句直到停机。8.7.2 选择和循环结构内部的顺序结构(1)譬如if(){},在{}内部是if的代码段,在代码段内部还是按照顺序结构来执行的。(2)switch case内部也一样,也是按照顺序结构执行的。(3)while,for内部也是按照顺序结构来执行的。8.7.3 编译过程中的顺序结

2020-10-21 21:04:37 101

原创 8-6 运算中的临时匿名变量

8.6.1 C语言和汇编的区别(汇编完全对应机器操作,C对应逻辑操作)(1)C语言叫高级语言,汇编语言叫低级语言。(2)低级语言的意思是汇编语言和机器操作相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思维。因为不同的CPU设计时指令集差异很大,因此用汇编编程的差异很大。(3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成的),给程序员提供了一个靠近人类思维的一些语法特征,人类不用过于考虑机器原理,而可以按照自己的逻辑原理来进行编程。譬如数组、结构体、指针…

2020-10-21 21:04:12 724

原创 8-5C语言中的NULL

8.5.1 NULL在C/C++中的标准定义(1)NULL不是C语言关键字,本质上是一个宏定义;(2)NULL的标准定义:#ifdef _cplusplus //条件编译#define NULL 0#else#define NULL (void *)0 //这里对应C语言的情况#endif解释:C++的编译环境中,编译器预先定义了一个宏_cplusplus,程序中可以用条件编译来判断当前的编译环境是C++还是C的。NULL的本质解析:NULL的本质是0,但是这个

2020-10-21 21:03:44 272

原创 8-4void类型的本质

8.4.1 C语言属强类型语言(1)编程语言分2种:强类型语言和弱类型语言。强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法;弱类型语言中没有类型的概念,所有变量全都是一个类型(一般都是字符串的),程序在用的时候再根据需要来处理变量。(2)C语言就是典型的强类型语言,C语言中所有的变量都有明确的类型。因为C语言中的一个变量都要对应内存中的一段内存,编译器需要这个变量的类型来确定这个变量占用内存的字节数和这一段内存的解析方法。8.4.2 数据类型的本质含义(1)数据

2020-10-21 21:03:14 83

原创 8-3 argc、argv与main函数的传参

8.3.1 谁给main函数传参(1)调用main函数所在的程序的它的父进程给main函数传参,并且接收main的返回值。8.3.2 为什么需要给main函数传参(1)首先,main函数不传参是可以的,也就是说父进程调用子程序并且给子程序传参不是必须的。int main(void)这种形式就表示我们认为不必要给main传参。(2)有时候我们希望程序有一种灵活性,所以选择在执行程序时通过传参来控制程序中的运行,达到不需要重新编译程序就可以改变程序运行结果的效果。8.3.3 表面上:给main传参是

2020-10-20 22:20:32 149

原创 8-2 main函数返回给谁?

8.2.1 函数为什么需要返回值?(1)函数在设计的时候设计了参数和返回值,参数是函数的输入,返回值是函数的输出。(2)因为函数需要对外输出数据(实际上是函数运行的一些结果值),因此需要返回值。(3)形式上来说,函数被另一个函数所调用,返回值作为函数式的值返回给调用这个函数的地方。总结:函数的返回值就是给调用它的人返回一个值。8.2.2 main函数被谁调用(1)main函数是特殊的,首先这个名字是特殊的。因为C语言规定了main函数是整个程序的入口。其它的函数只有直接或间接被main函数所调用

2020-10-20 21:47:32 399

原创 8-1 操作系统究竟是个什么玩意?

八、一些杂散但值得讨论的问题8.1.1 像人类社会一样的计算机软件系统(有些人只埋头干活,有些人只做管理)(1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作。当时是合适的,因为当时生产力低下,人口稀少。这就像裸机程序一样(裸机程序的特点是:代码量小,功能简单、所有代码都和直接目的有关,没有服务性代码)。(2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级)。本质上来说是合理的,因为资源得到了更大限度的使用,优化了配置,提升了整体效率。

2020-10-20 21:38:08 185

原创 7-7 最后的总结

(1)普通(自动)局部变量分配在栈上,作用域为代码块作用域,生命周期是临时的,链接属性为无连接。定义时如果未显示初始化则其值随机,变量地址由运行时在栈上分配得到,多次执行时地址不一定相同,函数不能返回该类变量的地址(指针)作为返回值。(2)静态局部变量分配在数据段/bss段(显式初始化为非0则在数据段,显式初始化为0或未显式初始化则在bss段),作用域为代码块作用域(人为规定的),生命周期为永久(天然的),链接属性为无连接(天然的)。定义时如果未显式初始化则其值为0(天然的),变量地址由运行时环境在加载程

2020-10-20 21:29:23 54

原创 7-6 链接属性

7.6.1 C语言程序的组织架构:多个C文件+多个h文件(1)庞大、完成的一个C语言程序(譬如Linux内核、uboot)由多个C文件和多个h文件组成的。(2)程序的生成过程就是:编译 + 链接;编译是为了将函数/变量等变成.o二进制的机器码格式,链接是为了将各个独立分开的二进制的函数链接起来形成一个整体的二进制可执行程序。7.6.2 编译以文件为单位、链接以工程为单位(1)编译器工作时是将所有源文件依次读进来,单个为单位进行编译的。(2)链接的时候实际上是把第一步编译生成的单个的.o文件整体的输

2020-10-20 21:23:27 276

原创 7-5 变量的生命周期

7.5.1 研究变量生命周期的意义(1)研究变量的生命周期,有助于理解变量的行为特征。注意:单独来看某一个知识点是没有什么意义的,但是将很多的知识点综合起来,就有意义了。所以有了一定的基础之后去做项目是一个很好的提高的方式,通过项目去学习这其中涉及到的各种知识点,又可以了解这些知识点在项目中是如何使用的,所以做项目时,一定要多去查阅资料,多去总结归纳,对不懂的知识点拆开来一个一个认真去研究。最后综合到项目里面来综合起来学习。7.5.2 栈变量的生命周期(1)局部变量(栈变量)存储在栈上,生命周期是临

2020-10-20 21:14:56 204

原创 7-4 作用域详解

7.4.1 局部变量的代码作用域(1)代码块基本可以理解为一对大括号{}括起来的部分。(2)代码块不等于函数,因为if,while,for都有{}。所以代码块是 <= 函数的。(3)局部变量的作用域是代码块作用域,也就是说一个局部变量可以被访问和使用的范围仅限于定义这个局部变量的代码块中定义式之后的部分。7.4.2 函数名和全局变量的文件作用域(1)文件作用域的意思就是全局的访问权限,也就是说在整个.c文件中都可以访问这些东西。这就是平时所说的局部和全局,全局就是文件作用域。(2)详细准确

2020-10-20 21:08:13 145

原创 7-3 存储类相关的关键字

7.3.1 auto(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。(2)auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。(既然在栈上,说明它如果不初始化那么值就是随机的,脏的…)(3)平时定义局部变量时就是定义auto的,只是省略auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。7.3.2 static(1)static关键字在C语言中有2种用法,而且这两种用法彼此没有任何关联、完全是独立的。其实当年本应该多发明一个关键字

2020-10-20 20:59:53 161

原创 7-2Linux下C程序的内存映像

7.2.1 代码段&只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是程序运行期间只能读不能写的数据,const修饰的常量有可能是存在只读数据段的(但是不一定,const常量的实现方法在不同平台是不一样的)7.2.2 数据段&bss段(1)数据段存:1、显式初始化为非0的全局变量;2、显式初始化为非0的static局部变量(2)bss段存:1、显式初始化为0或者未显式初始化的全局变量;2、显式初始化为0或未显式初始化的sta

2020-10-20 20:47:29 170

原创 7-1 概念解析

七、存储类&作用域&生命周期&链接属性7.1.1 存储类(1)存储类就是存储类型,也就是描述C语言中变量在何种地方存储。(2)内存有多种管理方法:栈、堆、数据段、bss段、text段…一个变量的存储类属性就是描述这个变量存储在何种内存段中。(3)譬如:局部变量分配在栈上,所以它的存储类就是栈;显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显式初始化(默认为0)的全局变量分配在bss段。7.1.2 作用域(1)作用域是描述这个变量起作用的代码范围。(2)基本

2020-10-20 20:39:03 215 1

原创 6-10自己制作静态连接库&动态链接库并使用

6.10.1制作静态链接库并使用(1)第一步:自己制作静态链接库首先使用gcc -c只编译不链接,生成.o文件;然后使用ar工具进行打包成.a的归档文件。库名不能随便乱起,一般是lib+库名称,后缀名是.a表示是一个归档文件注意:制作出来了静态库之后,发布时需要发布.a文件和.h文件//Makefile:all: gcc pointer8.c -o pointer8.o -c ar -rc libpointer8.a pointer8.o(2)第二步:使用静态链接库把.a和.h都放在我

2020-10-19 22:54:13 129

原创 6-9数学库函数

6.9.1 math.h(1)真正的数学运算的函数定义在:/usr/include/x86-linux-gnu/bits/mathcalls.h(2)使用数学库函数的时候,只需要包含math.h即可。6.9.2 计算开平方(1)库函数:double sqrt(double x);undefined reference to ‘sqrt’ collect2: error: ld returned l exit status分析:这个链接错误的意思是:sqrt函数声明(声明就在mat

2020-10-19 22:33:15 253

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除