自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 C语言复习(3)——结构体共用体

结构体的主要问题在于,结构体的大小,因为结构体需要内存对齐共用体的主要问题在于,共用体 共用低地址,所以共用体的大小取决于最大的的元素字节数一、结构体大小的计算struct A{ char a; int b;};本来应该是1+4=5,对齐之后是char(1字节)+int(4字节)是需要补齐三字节,以保证struct的字节数可以整除最大元素的字节数,所以A的字节计算为(1...

2019-07-24 21:25:18 429

原创 C语言复习(2)——如何确定函数指针与函数指针的使用

1、明确当前是什么类型int main(){ int a; //变量 int *b; //指针 int c[10]; //数组 int d(); //函数声明 /* 指针数组分析过程: 因为下标运算符的优先级高于*运算符,所以e首先与[]结合成为e[],所以e是个数组 又因为是e的前面是int*,所以它是个保存指针的数组,简称为指针数组 */ int *e[10];...

2019-07-24 21:06:19 349

原创 C语言复习(1)

1.逻辑运算符的短路效应/*逻辑运算符的短路效应对于逻辑与(&&)来说,同为真时才为真,所以当条件1为假时不需要计算条件2对于逻辑或(||)来说,同为假时才为假,所以当条件1为真时不需要计算条件2下面的运算形式为,先计算(++a && ++b)的结果,++a为真,故再计算++b,结果也为真,所以表达式(++a && ++b)为真对...

2019-07-19 00:25:21 367

原创 Java字符串比较及字符串常量池

一、首先看一段代码及其运行结果public class TestString { public static void main(String[] args){ String str1 = "test"; String str2 = "test"; String str3 = new String("test"); System.out.println("使用==测试...

2019-05-23 11:55:19 703

原创 Java内部类

在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。一、成员内部类成员内部类可以使用private、default、protected、public任意进行修饰。类文件名为:外部类$内部类.class二、非静态内部类在外部类内使用非静态内部类和平时使用其他类没什么不同1.非静态内部类必须寄存在一个外部类的对象里。因此,如果有一个非静态内部类对象...

2019-05-23 10:57:39 192

原创 Java的抽象与接口类

一、抽象方法使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。二、抽象类包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。三、抽象类的使用要点1.有抽象方法的类只能定义成抽象类2.抽象类不能实例化,即不能用new...

2019-05-21 16:51:58 169

原创 Java多态性和对象的转型

一、多态多态指的是同一个方法调用、由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。二、多态的要点1.多态是方法的多态,不是属性的多态(多态与属性无关_2.多态的存在要有三个必要条件:继承,方法重写,父类引用指向子类对象。3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。三、多态发生的示例代码public class TestPo...

2019-05-17 17:37:12 240

原创 Java的super关键字、访问权限修饰符以及final关键字的三种用法

一、super关键字1.super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。2.若是构造方法的第一行代码没有显示的调用super或者this(...);那么Java默认都会调用super();含义是调用父类无参数构造方法、这里的super可以省略二、构造方法调用顺序构造方法的第一句总是:super(...)来调用父类对应的构造方法。所以,流程就是:先向上...

2019-05-17 17:34:27 596

原创 Java的继承、重写和Object类

一、继承:1.使用extends关键字2.Java中只有单继承,没有C++中的多继承3.Java的接口可以多继承,类只有单继承4.子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不一定能直接访问(如,父类的私有属性和方法)5.如果定义一个类时,没用调用extends,则它的父类是java.lang.Object二、instanceof二元运算符左边放对象,右边放...

2019-05-14 21:51:29 262

原创 package和import

一、为什么需要package?1.为了解决类之间的重名问题。2.为了便于管理类:合适的类位于合适的包!二、package怎么用?通常是类的第一句非注释性语句。三、JDK中的主要包java.lang包含一些Java语言的核心类, 如String、 Math、 Integer、 System和Thread,提供常用功能。java.awt包含了构成抽象窗口工具集(abstract wind...

2019-05-13 21:20:07 381

原创 构造方法、对象的创建过程、this和static

一、构造方法/构造器的要点:1.通过new关键字调用2.构造器虽然有返回值,但是不能定义返回值类型(返回值类型肯定是本类),不能再构造器里使用return返回某个值3.如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则编译器不会自动添加4.构造方法的方法名必须与类名一致5.构造方法可以重载二、对象的创建过程创建一个对象分为四步:1.分配对象空间,并将对象成...

2019-05-13 09:38:48 324

原创 Java一些关于垃圾回收的知识

1.垃圾回收算法(1)引用计数法:堆中每个对象都有一个引用计数。被引用一次,计数加1,被引用的变量值变为null,则计数减1,知道计数为0,则变成无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法识别(2)引用可达法(根搜索算法)程序把所有的引用关系看做一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之...

2019-05-10 15:57:26 451

原创 Java内存分析

Java虚拟机的内存可以分为三个区域:栈Stack、堆heap、方法区method area1. 栈的特点(1)栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)(2)JVM为每个线程创建一个栈,用于存放该线程执行方法信息(实际参数、局部变量)(3)栈属于线程私有,不能实现线程间共享(4)栈由系统分配,速度快。栈是一个连续的内存空间2...

2019-05-09 23:27:51 127

原创 Java基础一些与C/C++不同的细节

1.注释单行注释,// 多行注释,/**/ 文档注释:以/**开头,以*/结尾,是C/C++中所没有的,后期可通过文档注释自动生成API2.标识符规则标识符命名规则简单,但是命名风格更重要,我使用阿里巴巴开发手册色命名风格,主要贴出变量名,类名和方法名的命名风格3.成员变量方法外部,类内部定义的变量,从属对象,生命周期伴随对象始终,如果不初始化,会自动初始化为该类型...

2019-05-08 21:00:24 247

原创 Java第一个程序及其特点

第一个程序:public class Welcome { public static void main(String[] args){ System.out.println("hello eclipse!"); }}Java程序的特点:Java是一个大小写敏感的语言 一个源文件可包含多个类class,一个源文件至多只能声明一个public类,源文件名必须与其中定义的p...

2019-05-03 17:01:12 201

原创 Java的运行机制以及Java跨平台的原理

1、首先说一下JDK、JRE和JVM的关系JDK(Java Development Kit)是 Java 语言的软件开发工具包,它包含有JRE、编译器和调试器等用于程序开发的文件。抛开JRE不谈,它主要能干编译和调试两件事。JRE(Java Runtime Environment)即java运行环境,它包含了JVM及java的核心类库。抛开JVM不谈,它主要提供一些必要的运行文件。JV...

2019-05-02 22:43:40 1837

原创 开始了

学习!!!

2019-05-02 10:52:05 130

原创 02单例模式

本来剑指offer中的单例模式是C#的,但是不代表C++中不能实现单例模式单例模式:只能生成该类的一个实例单例模式的实现过程1.构造函数私有2.类内有一个指向自己的静态指针3.提供一个可以访问这个类的get接口4.把拷贝构造函数和=操作符也设为私有,防止被复制5.有懒汉式与饿汉式解法1:只适用于单线程环境//只适用于单线程环境class Singleton1{pu...

2019-04-18 22:09:32 132

原创 "error LINK2019: 无法解析的外部符号"错误分析

错误原因:产生这个问题的真正原因是运行时找不到适当的程序入口函数。那么对于新手来说一个极大的可能就是,函数写了声明且需要调用此函数,却没有找到函数的实现,当你实现这个函数之后,这个问题自然就解决了。另外我还找的一个关于此问题更多可能性的分析,地址如下:https://www.cnblogs.com/hiloves/p/4678848.html...

2019-04-16 22:29:15 3246

原创 01赋值运算符函数

如下为类型声明,为该类添加赋值运算符函数。class CMyString{public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void);private: char* m_pData;};需要注意以下问题:1.返回值是否为引用:如果不是引用则...

2019-04-16 21:57:35 196

原创 C++子类继承父类后的子类相应的成员属性

子类继承方式 public protected private 父类成员属性 public public protected private protected protected protected private private 不可访问...

2019-03-06 17:22:47 3670

原创 STL容器的底层实现

STL容器 底层实现 备注 近容器 string - 数组[] - 顺序容器 vector 一维数组 list 双向链表 deque 二维数组 关联容器 set 红黑树 不允许数据重复 multiset 红黑树 允许数据...

2019-03-02 23:06:27 531

原创 Linux进程间通信(一)——管道

我们可以使用信号,创建通知事件,通过它引起响应,但传送的信息只限于一个信号值。接下来我将介绍管道,通过它进程之间可以交换更有用的数据。(1)管道的定义——什么是管道当从一个进程连接数据流到另一个进程时,我们使用术语管道(pipe),我们通常是把一个进程的输出通过管道连接到另一个进程的输入。对于shell命令来说,命令的连接是通过管道字符来完成的,如下:shell安排两个命令的标...

2019-01-10 23:58:58 193

原创 Linux系统的信号

(1)信号概念信号可以完成进程间通信,但是它的传输只能是一个信号值。信号是Linux系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。我们用术语生成来表示一个信号的产生,使用术语捕获表示接收到一个信号。信号是由于某些错误条件而生成的,如内存段冲突、非法指令等等。信号的名称在头文件signal.h中定义,它们都以SIG开头,部分信号如下:(2)发送信号...

2019-01-10 22:23:07 236

原创 C++面向对象的构造与析构函数

C++是面向对象的语言,和C语言面向过程有不同,C++更针对于一类事物的本质,它的使用就和C语言有所不同。下面是使用面向过程的思想经常使用的四个函数,下面的四个函数将会伴随我们C++的整个生涯。①构造函数,②拷贝构造函数,③重载=运算符函数,④析构函数。我们使用一个简单的Person类来讲解。class Person{private: char *_name; int _ag...

2019-01-09 12:59:38 263

原创 C&C++函数调用过程

调用函数主要关注三个方面分别是函数名,返回值和参数列表,我接下来将会深入底层讲解调用函数的过程。调用函数的过程主要有四方面,①函数参数代入,②函数栈帧开辟,③函数返回值,④函数栈帧回退首先来看一段简单的c文件代码,和它的汇编码,只需简单浏览即可:源码:int fun1(int a, int b){ int c = a + b; return c;}int main()...

2019-01-08 23:52:39 14611

原创 C&C++编译链接过程

本文讲解编译链接过程,因为才疏学浅可能有些不准确。使用c文件的编译链接过程,使用Linux系统用来查看文件信息。(1)从源文件main.c编译链接成main.exe,需要经历如下步骤:  (2)其中符号和符号表是什么呢?段又是什么?段:在一个程序中,所有的代码最后都只后生成指令和数据。指令和数据分别存在不同的段中。符号:所有的数据都会生成符号来标记它自己,指令中只会有函...

2019-01-08 19:00:21 243

原创 C++和C语言的区别(六)——命名空间

命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。所以使用标准标识符都有以下三种方式。(1)直接指定标识符(2) 使用using关键字(3)使用 using namespace std;当然命名空间不仅仅是这么使...

2019-01-07 23:55:35 637

原创 C++和C语言的区别(五)——变量引用

引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。(1)引用的实现int main(){ int a = 10; int &b = a; int *p = &a;}对于这一段代码,我们通过编译器查看该代码的汇编码如下:可以看到引用操作和指针操作的汇编码完全相同,所以我们就可以知道,引用如何做到①引用的底层是一个const...

2019-01-07 23:40:56 379

原创 C++和C语言的区别(四)——使用C++中特性替换宏定义

C语言的宏有一个重要特性那就是在预处理阶段就进行字符替换。用C++的特性替换C语言中的宏主要有三种方式:①typedef、②inline函数、③const修饰符而这三种方式都有和宏最大不同的区别就是,他们都是在编译期进行的。(1)typedef:C语言与C++两者所共有的,但是与宏仍有区别,区别如下:①typedef 创建的符号名只受限于类型,不能用于值。②typedef 由编...

2019-01-07 23:04:38 483

原创 C++和C语言的区别(三)——const

(1).c文件与.cpp文件中const的区别我们先引用两个大致相同的代码段:c文件中: C++文件中:可以看到两段近似相同的代码竟然出现了不同的输出。 他们的主要区别如下,这就可以解释为什么C++文件中打印的值为10了。 (2)c++文件中const与指针的联合使用int main(){ int a = 10; int b = 20; const ...

2019-01-07 22:39:40 164

原创 C++和C语言的区别(二)——动态开辟内存的区别与new的使用

C++中和C语言中都有动态开辟内存的概念,C语言中使用的是库函数malloc和free,而C++中使用的则是关键字new与delete,它们的部分区别如下:现在我们同时使用两种方式动态开辟二维数组a[5][5]C语言:#include <malloc.h>#include <assert.h>int main(){ //动态开辟二维数组 int...

2019-01-07 22:25:30 365

原创 隐式类型转换

C语言和C++有时候会出现一些隐式类型的转换,本文不讨论何种情况转换,讨论当转换的时候会怎么转换。用图来表示,画的特别粗略,很多类型都没表示出来,只是为了说明情况。当两种不同类型的数据进行运算的时候,两种数据转换到相同的类型进行计算。但是不能进行优先转换的降级。...

2018-12-31 00:22:59 193

原创 C++和C语言的区别(一)——函数的区别

C++有添加的新的特性也有与C语言的一些区别,为了方便学习,就特别对重要的一些特性和区别进行学习。此次学习的是:1、函数的默认参数,2、inline函数,3、函数重载 1、C++的函数默认参数:在函数声明或定义时候,给函数参数预先赋值,当函数调用有空缺参数时,就将该值作为默认参数传入。(1)默认值必须从右向左一次赋值,不可跳过。void fun(int a, int b, int...

2018-12-31 00:00:55 1619

原创 Linux系统fork和exec创建新进程

fork之后经常跟随着exec,即创建一个进程后就立马替换进程,所以并不执行一个父进程数据段、栈和堆的完全复制,因此这里使用的是写时拷贝技术。我们使用程序来演示替换:使用的程序代码类似演示父子进程的代码,但是子进程使用了exec进行替换。代码仍然会出现父子进程的打印交替出现吗?可以看到,父进程总共打印了七次,子进程直接被替换成了ps,并且没有打印信息。这是因为,exec...

2018-12-19 00:36:09 1401

原创 Linux系统fork函数所产生的文件共享

当我们了解了fork函数之后,知道子进程会拷贝父进程的信息,那如果打开文件进行文件处理和fork在同一函数中会发生什么呢?我们先创建一个在程序中打开的文件:string文件内容:(1)先open后fork 其运行结果如下图:可以看到父子进程共打印了string文件中的6个字符,这是因为父进程所有打开的文件描述符(可以查看文件描述符博客)都被复制到子进程中。先打开文件,后...

2018-12-18 17:46:10 451

原创 Linux系统的exec替换函数

fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。exec函数负责读取可执行行文件并将其载入地址空间开始运行。我们有六种不同的exec函数可供使用,它们常常被统称为exec函数。下面这几个是exec函数的库函数,它们都依存于execve系统调用函数: execve系统调用函数:返回值:成功不返回,出错返回-1file参数:其中filenam...

2018-12-16 18:31:35 385

原创 Linux系统僵死进程的处理

下面的代码,可以看到父进程执行10次,子进程执行3次。我们将程序挂在后台运行,当子进程运行结束后,我们运行ps查看进程,可以看到,子进程好像仍然存在。 进程总归是要终结的。当一个进程终结时,内核必须释放它所占有的资源,并把这一事件,告知其父进程。但是系统为了在子进程终结后仍能获得它的信息,所以进程保留了它的进程描述符(即PCB),所以这种情况的进程叫做僵死进程。现在有以下方法可...

2018-12-15 21:50:00 575

原创 Linux系统fork函数介绍

fork函数通过拷贝当前进程创建一个子进程。在fork之前,我们先了解一些别的知识。传统的fork系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork使用写时拷贝页实现。写时拷贝:写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制...

2018-12-13 21:59:36 459

原创 Linux系统下循环fork所产生的进程数量

我们知道fork函数可以创建一个新进程,那当fork和循环一起使用的时候会发生什么情况。为了方便查看进程数量,我们在fork的同时打印A,分析A的数量就可知有多少个进程。情景1(循环2次,先fork后打印) 程序代码如图所示,运行结果如下图:可以看到,总打印出来了6个A,为什么是6个A呢?6个A就是6个进程吗?其实并不是,因为我们是先fork后打印。所以,在第1次循环,...

2018-12-13 20:16:34 4524 1

空空如也

空空如也

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

TA关注的人

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