符号表

指针和引用的区别

微笑、不失礼 提交于 2020-01-14 06:23:03
1、指针是存放变量地址的一个变量,指向内存的一个存储单元,在逻辑上是独立的,可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 引用是其所引用的变量的一个别名,与其所引用的变量实质上是同一个东西,在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 2、指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的);3 3、指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; 4、指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了; 5、"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小; 6、指针和引用的自增(++)运算意义不一样; 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

python模块的作用和说明

馋奶兔 提交于 2020-01-02 22:24:09
Python模块 如果你从Python解释器退出并再次进入,之前的定义(函数和变量)都会丢失。因此,如果你想编写一个稍长些的程序,最好使用文本编辑器为解释器准备输入并将该文件作为输入运行。这被称作编写 脚本 。随着程序变得越来越长,你或许会想把它拆分成几个文件,以方便维护。你亦或想在不同的程序中使用一个便捷的函数, 而不必把这个函数复制到每一个程序中去。 为支持这些, Python 有一种方法可以把定义放在一个文件里,并在脚本或解释器的交互式实例中使用它们。这样的文件被称作 python模块 ;模块中的定义可以 导入 到其它模块或者 主 模块(你在顶级和计算器模式下执行的脚本中可以访问的变量集合)。 模块是一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀 .py 。在一个模块内部,模块名(作为一个字符串)可以通过全局变量 __name__ 的值获得。例如,使用你最喜爱的文本编辑器在当前目录下创建一个名为 fibo.py 的文件, 文件中含有以下内容: # Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print() def fib2(n): # return

android多so文件解析

僤鯓⒐⒋嵵緔 提交于 2019-12-28 12:37:14
android支持如下7中CPU架构 目前android支持如下7中CPU架构: armeabi 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢(只支持armeabi) armeabi-v7a 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构) arm64-v8a 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit(支持 armeabi-v7a、armeabi 和 arm64-v8a) x86 intel 32位,一般用于平板(支持 armeabi(性能有所损耗) 和 x86) x86_64 intel 64位,一般用于平板(支持 x86 和 x86_64) mips 基本没见过(支持 mips) mips64 基本没见过(支持 mips 和 mips_64) 单个cpu架构文件夹下包含多个so文件 现在以armeabi-v7a架构下的文件夹为例 如上图所示,该文件夹下的共有6个so文件。 在生成符号表时,需要对这6个so文件都执行执行如下步骤: 执行生成符号文件命令: $ dump_syms libxxx.so > libxxx.so.sym 查看libxxx.so.sym文件内容,从头部获取uuid

C++学习笔记----3.2 C++引用在本质上是什么,它和指针到底有什么区别

妖精的绣舞 提交于 2019-12-24 06:56:57
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 在 C++ 中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数

描述编译和链接过程

谁都会走 提交于 2019-12-20 18:04:09
原文摘自: http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html [yc]详解link 详解link 有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,Elicpse,Dev C++等),你可能不会发现程序是如何组织起来的(很多人因此而反对初学者使用IDE)。因为使用IDE,你所做的事情,就是在一个项目里新建一系列的.cpp和.h文件,编写好之后在菜单里点击“编译”,就万事大吉了。但其实以前,程序员写程序不是这样的。他们首先要打开一个编辑器,像编写文本文件一样的写好代码,然后在命令行下敲 cc 1.cpp -o 1.o cc 2.cpp -o 2.o cc 3.cpp -o 3.o 这里cc代表某个C/C++编译器,后面紧跟着要编译的cpp文件,并且以-o指定要输出的文件(请原谅我没有使用任何一个流行编译器作为例子)。这样当前目录下就会出现: 1.o 2.o 3.o 最后

c++中引用与指针的区别

我怕爱的太早我们不能终老 提交于 2019-12-19 21:15:42
(1) 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。 指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。 (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性 。 (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。 还有一种情况,就是当你重载某个操作符时,你应该使用引用

INUX下三个内核文件详解(vmlinuz/initrd.img/System.map)

自闭症网瘾萝莉.ら 提交于 2019-12-18 12:46:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行:ls –l。编译过RedHat Linux内核的人对其中的System.map 、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生 的?又有什么作用呢?本文对此做些介绍。 一、vmlinuz vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。 vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot

Linux基础(03)gdb调试

萝らか妹 提交于 2019-12-17 18:10:30
1. 安装GDB增强工具 (gef)   * GDB的版本大于7.7   * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh   * 确保网络连通 并且成功更新ubuntu (更新source.list 使用apt-get update) 2. GDB安装插件(在root权限安装,用户权限使用不了需要在用户权限下安装)   git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins  (安装gdb的Python脚本插件)   切换gdb模式 :   echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit    (默认打开gdb插件是pada)  倾向于破解和逆向   echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit      倾向于debug 逆向   echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit    个人定制 3.Linux程序发布流程   * 确定程序是否存在符号表     readelf -s test-1   * 生成符号表    

WinDbg 蓝屏dump分析教程

一个人想着一个人 提交于 2019-12-17 04:11:46
一、WinDbg是什么?它能做什么?   WinDbg是在windows平台下,强大的用户态和内核态调试工具。它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏、程序崩溃(IE崩溃)原因,是我们日常工作中必不可少的一个有力工具,学会使用它,将有效提升我们的问题解决效率和准确率。 二、WinDbg下载: http://www.windbg.org/ 三、设置符号表:   符号表是WinDbg关键的“数据库”,如果没有它,WinDbg基本上就是个废物,无法分析出更多问题原因。所以使用WinDbg设置符号表,是必须要走的一步。 1、运行WinDbg软件,然后按【Ctrl+S】弹出符号表设置窗 2、将符号表地址: SRV* C:\Symbols *http://msdl.microsoft.com/download/symbols 粘贴在输入框中,点击确定即可。 注:红色字体为符号表本地存储路径,建议固定路径,可避免符号表重复下载。 四、记录DMP文件 运行输入sysdm.cpl,进“高级——启动和故障恢复设置”,里面这几个蓝屏后生成报告的复选框勾着,这样蓝屏后系统会在minidump里面会生成dmp文件。 如图: 五、学会打开第一个dmp文件!   当你拿到一个dmp文件后,可使用【 Ctrl+D 】快捷键来打开一个dmp文件,或者点击WinDbg界面上的【File=>Open

【计算机笔记】Java 符号表

感情迁移 提交于 2019-12-17 03:01:31
前言 初级实现 1. 链表实现无序符号表 2. 二分查找实现有序符号表 二叉查找树 1. get() 2. put() 3. 分析 4. floor() 5. rank() 6. min() 7. deleteMin() 8. delete() 9. keys() 10. 分析 2-3 查找树 1. 插入操作 2. 性质 红黑树 1. 左旋转 2. 右旋转 3. 颜色转换 4. 插入 5. 分析 散列表 1. 散列函数 2. 拉链法 3. 线性探测法 小结 1. 符号表算法比较 2. Java 的符号表实现 3. 稀疏向量乘法 前言 符号表(Symbol Table)是一种存储键值对的数据结构,可以支持快速查找操作。 符号表分为有序和无序两种,有序符号表主要指支持 min()、max() 等根据键的大小关系来实现的操作。 有序符号表的键需要实现 Comparable 接口。 public interface UnorderedST < Key , Value > { int size ( ) ; Value get ( Key key ) ; void put ( Key key , Value value ) ; void delete ( Key key ) ; } public interface OrderedST < Key extends Comparable <