- 博客(26)
- 收藏
- 关注
原创 编译链接原理
编译链接原理编译阶段一共分为3部:预编译阶段,编译阶段,和汇编阶段。我们先来看第一阶段:预编译:将源代码文件.c和相关的头文件.h等 预编译成一个.i文件gcc -E hello.c -o hello.i (-E表示只预编译)预编译阶段主要处理以”#”开始的预编译指令主要处理规则如下:①:将所有的”define”删除,展开所有的宏定义②:处理所有条件预编译指令,比如“if”,“ifdef”,“ifndef”,“endif”,“else”③:处理”#include”预编译指令,将被包含的文
2021-08-25 11:35:08
174
原创 4G虚拟地址空间
虚拟地址空间分布对于每一个进程都会对应一个虚拟地址空间,对于32位的操作系统(其指令的位数最大为32位,因此地址码最多32位),虚拟地址空间的大小为2^{32}B即0~4GB的虚拟地址空间,其中内核空间为1GB,其他的3G属于用户空间如下所示:0~3G的用户空间。从小到大(从下往上)依次为:保留区(受保护的地址)、代码段、数据段(.data段)、.bss段、堆空间、内存映射段、栈空间、命令行参数和环境变量。下面依次对每一个段做简单的介绍:首先是用户空间:①:128M大小的不可访问区域(保留区)我
2021-08-25 11:25:29
652
原创 函数 模板
函数模板函数重载和函数模板有着相似的作用,但是函数模板有一些方面上有很大优势。例如:将传入的两个值相加当传入不同类型的数据时,还要将相对应的数据类型的函数实现。那么函数模板就可以只写一个函数就可以处理传入的所有数据类型。例如:而模板函数则就是一个函数了,是通过在调用点传入模板类型到虚假模板类性参数列表里,然后函数模板根据这个传入的模板类型就可以实例化一份函数,这个函数就叫做模板函数。模板的作用就是将类型参数化如我们传入int类型,则会实例化一份下面的函数:注意:模板体在编译阶段是不编
2021-08-10 15:34:50
97
原创 类和对象基础
类和对象类的概念我们前面了解过C语言是一门面向过程的编程语言,而C++是一门面向对象的编程语言,这个“面向对象”其实就体现在类和对象上,我们画上一幅图可以清楚认识一下:C++的三大特性:封装、继承、多态继承和多态我们放在后面进行了解,这里主要搞清楚什么是封装:封装是面向对象程序设计的基础特征。它是将数据(属性)与函数(方法)进行合并成一个整体,也就是我们上面所说的类。(把属性和方法进行封装)将客观事物封装成抽象的类,类可以将自己的属性与方法对指定的用户开放,对其他用户进行隐藏。(对属性和方
2021-08-10 13:23:03
53
原创 C和C++区别
C和C++的区别首先我们先简单介绍一下C语言和C++:①:C语言的介绍C语言是一个结构化语言,它的重点在于算法和数据结构。C语言的设计首要考虑的是如果通过一个过程对输入进行运算处理得到输出。C语言可以做任何用处,但最大的用处还是写写操作系统和编译器之类的。C语言是非常有效率的,作为一个底层编译语言,可以通过指针直接去对内存进行管理,另外很多语言都是用C语言来设计的,如java,python。②:C++的介绍C++是对C语言的继承与发展,C++功能很强大,可以应用开发大型应用软件。即可以面
2021-08-08 16:47:20
5508
原创 斐波那契数列和动态规划
斐波那契数列斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…这个数列从第3项开始,每一项都等于前两项之和。1、递归法求解刚学习C语言的递归的同学们一般都会想到递归法求解。typedef unsigned int u_int;u_int fac(u_int n){ if(n==1||n==2) ret
2021-08-08 11:14:46
167
原创 大数的定义与实现
大数当一些数字超过整型的上限,那么该如何存储这些数字呢,那就要使用大数来存储。class BigNumber{private: vector<int> _vec; bool fag;//判断正负号true代表负号,false代表正号 friend ostream& operator<<(ostream& out, const BigNumber& num);//设置友元方便其他函数使用类内成员 friend istream& opera
2021-07-06 20:50:43
280
原创 Mystring类的实现
Mystring类的定义:#include<iostream>using namespace std;class Mstring{private: int _len; char* _str;public: Mstring(); Mstring(const Mstring& src); Mstring(const char* str); ~Mstring(); Mstring& operator=(const Mstring& src); Ms
2021-07-06 20:19:07
516
原创 C和C++直接的相互调用
C和C++代码的相互调用在学习c++中,用到一些古老的c语言库时,在工作中,我们经常要使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出现问题。为了让双方和谐地工作,我们就得用到extern “C”。extern "C"exten‘c’的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而
2021-07-06 19:55:03
124
原创 Linux的几个基础命令
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档Linux的几个基础命令一、文件权限命令1、chmod命令2、chown命令二、基础命令1.文件打包或解压命令tar2.文件内容查看命令三、系统状态查看命令一、文件权限命令权限是Linux中的重要概念,每个文件/目录等都具有权限,通过ls -l命令我们可以 查看某个目录下的文件或目录的权限文件的类型:d:代表目录-:代表文件l:代表链接(可以认为是window中的快捷方式)后面的9位分为3组,每3位置一组,分别代表属主的权
2021-07-06 19:43:11
225
原创 串的朴素(BF)算法和KMP匹配算法
串的朴素算法和KMP匹配算法算法实现//时间复杂度: O(n*m)int BF(const char* s, const char* p, int pos){ int i = pos, j = 0; int lens = strlen(s); int lenp = strlen(p); while (i < lens && j < lenp) { if (s[i] == p[j]) { i++; j++; } else {
2021-06-07 19:48:23
119
原创 顺序队列和链队列
顺序队列和链队列队列的定义:队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。顺序队列的结构定义#define MAXQSIZE 10typedef struct queue{ int* base;//指向动态内存 int front;//队头指针,队头元素的下标 int rear;//队尾指针,当前可以插入数据的
2021-06-07 19:26:56
702
原创 顺序栈和链栈的实现
顺序栈和链栈的实现栈的定义:它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。顺序栈的结构定义:typedef int ElemType;#define STACK_INIT_SIZE 10typedef struct Stack{ ElemType
2021-06-07 19:23:32
143
原创 双向链表的实现
双向链表的实现双向链表:(头结点前驱指向NULL,尾结点后继指向NULL)双向链表的设计typedef int ELEMTYPE;typedef struct DNode{ ELEMTYPE data;//数据域 DNode *next;//指向直接后继 DNode *prior;//指向直接前驱}DNode, *Dlist;//Dlist == DNode*双向链表的操作://初始化void Initlist(Dlist plist);//头插bool Insert_h
2021-06-07 19:16:55
76
原创 不带头结点的单链表的实现
不带头结点的单链表的实现单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。不带头结点的单链表的结构定义:typedef int ElemType;typedef struct SNode{ ElemType data; // 元素 struct Node *next; // 下一个结点的地址}
2021-06-07 19:08:47
718
原创 带头结点的单链表的实现
带头结点的单链表的实现单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。带头结点的单链表的结构定义:typedef int ElemType;typedef struct Node{ union { int length; ElemType data; }; struct N
2021-06-07 19:03:39
297
原创 线性表的顺序实现
线性表的顺序实现1、顺序表的结构顺序表结构中需要的成员:1、用于存储数据元素的空间位置2、当前已存储的数据元素的个数 – 记录存储数据的位置3、空间能够存储的元素的总量 – 扩容4、顺序表存储数据元素时,必须从空间的起始位置开始连续存储2、顺序表的C语言结构设计#define DEFAULTSIZE 10typedef int ElemType;typedef struct SqList{ ElemType *data; // 指向用于存储ElemType类型的堆区空间的指针 in
2021-06-07 18:21:30
122
原创 八大内部排序
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里讲的是内部排序。1、直接插入排序将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。算法实现://第一种排序算法:直接插入排序:如果数组基本有序,我们就用直接插入排序,越有序,时间复杂度越小,极端情况下为O(n)v
2021-06-07 18:06:32
253
原创 指针
一、什么是指针 计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如int类型占用4个字节,char类型占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就想门牌号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址或指针。地址从0开始最小的地址为0x0000 0000,最大的地址为0xFFFF FFFF。二、定义一个指针``int *p,s; //p是整型指针
2021-04-19 20:09:40
69
原创 堆和栈的区别
堆和栈的区别1、管理方式:栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏;2、生长方向:堆的生长方向向上,内存地址由低到高,是不连续的内存区域;栈的生长方向向下,内存地址由高到低,是连续的内存区域。3、空间大小:理论上,程序员可申请的堆大小为虚拟内存的大小,Window进程栈的大小默认 为1MB,Linux下为10MB;4、存储内容:栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存
2021-04-08 14:36:41
124
原创 结构体内存对齐
由于存储变量地址对齐的问题,计算结构体大小的3条规则:结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍。结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍。#inclue<stdio.h>struct node{char cha;int ia;char chb;}int main(){ struct node a;
2021-04-05 20:12:45
59
原创 寻找数组的重复值
利用异或的思想,解决数组的重复值。大小为int[10]数组的取值范围是1-9。#include<stdio.h>int re_find(int* ar, int n){ int tmp = 0; for (int i = 0; i < n; i++) { tmp = tmp ^ ar[i]; } for (int i = 1; i <= n - 1; i++) { tmp = tmp ^ i; } return tmp;}int main(){
2021-04-02 20:51:35
70
原创 编译、预编译、链接
1、预编译预编译:首先是源代码文件hello.c和相关的头文件,如stdio.h等被预编译器cpp预编译成一个.i文件。对于C++程序来说,它的源代码文件的扩展名可能是.cpp或.cxx,头文件的扩展名可能是.hpp,而预编译后的文件扩展名是.ii。第一步预编译的过程相当于如下命令(-E表示只进行预编译):$gcc -E hello.c -o hello.i//或者$cpp hello.c > hello.i预编译过程主要处理那些源代码文件中的以”#”开始的预编译指令。比如”#includ
2021-04-02 16:01:34
251
原创 初始化不重复数字的数组
为了初始化一个不含有重复数组的数组,有几种不同的方式。第一种、查表法#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a[100],i, j; int b[101] = { 0 }; srand(time(NULL)); for (i = 0; i < 100; ) { j = (
2021-03-31 21:56:41
74
原创 作用域和生存期
作用域(可见性)指标识符能够被使用的范围只有在作用域内标识符才可以被使用。此阶段针对编译和链接过程1)函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作函数。2)文件作用域也称全局作用域。定义在所有函数之外的标识符,具有文件作用域,作用域为从定义处到整个源文件结束,文件中定义的全局变量和函数都具有文件作用域。生存期也叫生命期( Life time)。此阶段针对的是程序的执行过程。生命期指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的
2021-03-31 21:37:12
289
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人