指针

Go语言基础介绍

前提是你 提交于 2019-12-25 01:07:12
Go是一个开源的编程语言。Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。目前,Go最新发布版本为1.10. Go语言可以运行在Linux、FreeBSD、Mac OS X和Windows系统上。 1. 结构:Go语言的基础组成有以下几个部分:包声明、引入包、函数、变量、语句&表达式、注释。 (1)、必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main (2)、注释与C++相同,有单行注释即”//”和多行注释即”/* … */”两种。 (3)、当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出;标识符如果以小写字母开头,则对包外是不可见的,但是它们在整个包的内部是可见并且可用的。 2. 基础语法: (1)、Go标记:Go程序可以由多个标记组成,可以是关键字、标识符、常量、字符串、字符。 (2)、行分隔符:在Go程序中,一行代表一个语句结束。每个语句不需要像C++语言一样以分号”;”结尾,因为这些工作都将由Go编译器自动完成。如果你打算将多个语句写在同一行,它们必须使用”;”为区分,但在实际开发中我们并不鼓励这种做法。 (3)、注释:注释不会被编译,每一个包应该有相关注释。单行注释以”//

线性表

江枫思渺然 提交于 2019-12-24 19:06:18
阅读目录 一、线性表类型定义 二、顺序表 三、链表 四、总结 一、线性表类型定义 1.定义 线性表是n个数据元素的有限序列 2.基本操作 InitList(&L) #构造一个空的线性表L DestroyList(&L) #销毁线性表L ClearList(&L) #将L重置为空表 ListLength(L) #返回L中数据元素个数 GetItem(L,i,&e) #用e返回L中第i个数据元素的值 LocateElem(L,e,compare()) #返回L中第1个与e满足关系compare()的数据元素的位序。若这样的数据远古三不存在,则返回值为0 ListInsert(&L,i,e) #在L中第i个位置之前插入新的数据元素e,L的长度加1 ListDelete(&L,i,&e) #删除L的dii个数据元素,并用e返回其值,L的长度减1 二、顺序表 1.定义 线性表的顺序存储结构称为顺序表。 假设线性表的每个元素需占用l个存储单元,一般来说,线性表的第i个数据元素a i的存储位置为LOC(a i) = LOC(a 1) + (i-1)*l 2.实现 由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。在此,由于线性表的长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可用动态分配的一维数组 顺序开始为为1

C++指针(一)---c

自闭症网瘾萝莉.ら 提交于 2019-12-24 19:01:49
一、取地址运算符&(内存地址) C++编译的程序占用的内存分为以下几个部分: 1.栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。与其它分区不同,变量的地址是按照申请顺序降序排列的。 2.堆区: 由new指令申请,由delete指令释放。申请后不释放可能会造成内存资源的浪费。需要指出,对于用指针申请的对内存空间,指针本身存入栈,指针指向的空间则存储在堆中。 3.全局(静态)变量区:全局变量和静态(由static修饰)变量的存储是放在一块的。从程序开始运行时写入变量值,运行结束前释放变量。 4.程序代码区:用于存放函数体的二进制代码。 另外,还有专门用于存放常量的区域。 下面编写程序进行测试,证明以上几种变量分区不同。 #include <iostream> using namespace std; int x,y,z; void f1(){}; void f2(){}; void main() { int a,b,c; cout<<"局部变量的地址:"<<endl; cout<<&a<<" "<<&b<<" "<<&c<<endl;//地址降序 int *m = new int[3], *n = new int, *l = new int, *k = new int; cout<<"指针所指向的内存的地址:"<<endl; cout

动态数组(一维二维)探秘

隐身守侯 提交于 2019-12-24 18:38:12
因为做leetcode的一道算法题 https://leetcode-cn.com/problems/regular-expression-matching/ ,需要用到二维数组,结果自己在理解和使用上有很大误解,所以单独拿出来,从内存等各方面透彻的梳理一遍。 一维数组 char * a = (char*)malloc(8 * sizeof(char)); memset(a, 0, 8); for (int i = 0; i < 8; i++) { *(a + i) = 'a' + i; } for (int i = 0; i < 8; i++) { cout << *(a+i); } for (int i = 0; i < 8; i++) { cout << a[i]; } free(a); 输出内容abcdefghabcdefgh 这样申请与char a[8]是一样的,不管是底层实现还是使用,都是一样的,这就是一个8个字节长度的数组。我们看内存,也是一段连续的数据。 释放内存的时候,系统可以根据内存管理把这连续的8个字节的空间回收。 二维数组 我们先看一下正常的用法 char a[8][4] = { 0 }; for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { a[i][j] = 'a' + i; } }

排序算法 (Java)

余生长醉 提交于 2019-12-24 18:32:39
视频参考:B站:马士兵,青岛大学–王卓。 时间复杂度 Big O 算法花费时间随着问题规模的扩大的变化 不考虑必须要做的操作:循环、赋初值、程序初始化…; 不考虑常数项; 不考虑低次项; 一般时间复杂度都是“最差”的情况 E.g.: 访问数组某个位置的值: O(1) 访问链表某个位置的值: O(n) 求数组平均数:O(n) 选择排序 SelectionSort 最简单 最没用: O(n^2), 不稳定 找到最小的数的位置(索引) 把这个位置上的数和【0】上的数交换 把除第一个位置之后的剩余部分的数组重复过程,确定位置【1】的数 循环3的操作,直到最后一个数 时间复杂度:计算执行次数最多语句的时间随着规模扩大的规律,然后忽略常数项、低次项 笔记:外循环i控制每轮要排的最小值的索引;内循环遍历最小值索引后的每一位索引的值,与当前最小值索引上的值作比较,把最小的值换到最小值索引上。 /** * 选择排序 * @param arr */ public static void selectionSort(int[] arr) { //由于要保证i后面还有数才需要排序,所以i最大可以取到[arr.length-2]就行 for (int i = 0; i < arr.length-1 ; i++) { //执行n次 int minPos = i; //每次循环的要求的最小值的位置都加1 /

GC的前世与今生

倾然丶 夕夏残阳落幕 提交于 2019-12-24 16:39:08
GC的前世与今生 虽然本文是以.net作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受。而后,1984年由Dave Ungar开发的Small talk语言第一次采用了Generational garbage collection的技术(这个技术在下文中会谈到),但是Small talk也没有得到十分广泛的应用。 直到20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.net出现了,.net采用了和Java类似的方法由CLR(Common Language Runtime)来管理

GC的前世与今生

寵の児 提交于 2019-12-24 16:38:54
   原文地址:http://kb.cnblogs.com/page/106720/   作者: spring yang GC的前世与今生   虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。   但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受。而后,1984年由Dave Ungar开发的Smalltalk语言第一次采用了Generational garbage collection的技术(这个技术在下文中会谈到),但是Smalltalk也没有得到十分广泛的应用。   直到20世纪90年代中期GC才以主角的身份登上了历史的舞台,这不得不归功于Java的进步,今日的GC已非吴下阿蒙。Java采用VM(Virtual Machine)机制,由VM来管理程序的运行当然也包括对GC管理。90年代末期.NET出现了,

VC++ Dump文件生成&分析

*爱你&永不变心* 提交于 2019-12-24 14:42:37
请看示例(图1): 很明显,在代码行108行有一个对空指针p的赋值操作,在IDE环境下运行,结果如下(图2): 提示p是nullptr。一位曾经工作于中科院的学者告诉我,程序运行过程中出现错误提示,90%都是错误指针(空指针、野指针)引起的,鉴于多年工作经验的总结,对于这一点我深信无疑。IDE环境下运行,我们很容易发现和解决类似这种错误,但是如果我们脱离IDE运行,一般都会提示0xC0000005错误提示对话框,这个时候要解决这种问题就有些茫然了,手足无措,不知如何下手了。要解决类似这种问题,我们需要借助应用程序异常调试信息记录文件CrashDump文件,那么我们如何来生成这样的文件呢?请看修改后的代码: void ExpTest5() { char *p = NULL; p[0] = 0; } void ExpTest4() { ExpTest5(); } void ExpTest3() { ExpTest4(); } void ExpTest2() { ExpTest3(); } void ExpTest1() { ExpTest2(); } #include <dbgHelp.h> #pragma comment(lib, "dbghelp.lib") void WINAPI WriteCrashDumpFile(_EXCEPTION_POINTERS * pExInfo,

C++对象模型:单继承,多继承,虚继承

泄露秘密 提交于 2019-12-24 14:13:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 class data members:static和nonstatic class data functions:static、nonstatic和virtual 比如: class Base { public: Base(int i) :baseI(i){}; int getI(){ return baseI; } static void countI(){}; virtual void print(void){ cout << "Base::print()"; } virtual ~Base(){} private: int baseI; static int baseS; }; 对象模型分类 简单对象模型 :这个模型非常地简单粗暴。在该模型下,对象由一系列的指针组成,每一个指针都指向一个数据成员或成员函数,也即是说,每个数据成员和成员函数在类中所占的大小是相同的,都为一个指针的大小。这样有个好处——很容易算出对象的大小,不过赔上的是空间和执行期效率。所以这种对象模型并没有被用于实际产品上。 表格驱动对象模型

文件处理

牧云@^-^@ 提交于 2019-12-24 11:23:14
Python-09 @(Python) 文件处理 一、什么是文件 文件是操作系统为用户或应用程序,提供的一个读写硬盘的虚拟单位,文件可以是文本文件、视频、音频、图片等形式 对文件的读写操作,其实就是对操作系统发起请求,然后由操作系统控制硬盘来读写 二、 为什么要有文件 计算机和人,有永久保存和使用数据的需求,文件可以永久保存在磁盘中,并且可被临时存储到内存 三、文件的基本操作 1. 打开文件 打开文件的语法: open(r'文件路径') r(rawstring ) :原生字符串,表示后面出现的都是原生字符,没有其他特殊意义,也可以使用 \ 单个转义 f=open(r'文件路径') ,将 open(r'文件路径') 赋值,此时是占用了应用程序的资源 2. 操作文件(读或写) data=f.read() 表示向操作系统发起打开文件请求,要求打开文件(文件操作会占用操作系统和应用程序的资源) 读写的操作会被操作系统转成具体的硬盘操作,将文件由硬盘读入内存 3. 关闭文件 f.close() 表示关闭文件,回收占用操作系统的资源,关闭的是 f 的值在操作系统的资源,本身的值还在应用程序的内存中 不要使用del删除变量的绑定关系,虽然能删除绑定关系,但是这个打开的文件,还会占用操作系统的资源,需要等待一定时间才能被回收,如果这样的文件过多,就会导致占用大量的资源 4. 总结