指针变量

leetcode11 盛最多的水

老子叫甜甜 提交于 2020-02-05 06:01:12
利用 双指针方法 解决本题。。(貌似还可以利用栈来解决,不过思路可能要复杂一些。) 本题抛开具体问题,想到双指针解决是降低时间复杂度的关键一步,本题如果利用暴力法解决,时间复杂度为O(n^2), 但是采用双指针法解决,时间复杂度会降低到O(n)。 时间复杂度为O(n),说明问题必须要在遍历一遍数组就解决。 从图上可直观看出,两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大。 我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 maxarea来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较长线段那端移动一步。 class Solution { public: int maxArea(vector<int>& height) { int L = 0; int R = height.size()-1; int max_Area = 0; while(L!=R){ int temp = min(height[L],height[R])*(R-L); if(temp>max_Area) max_Area = temp; if(height[L]<height[R]){ L++; }else{ R--; } }

对指针的深入理解

烈酒焚心 提交于 2020-02-05 02:31:52
对指针的深入了解 初学者的福利来了!!!! 首先对变量这一词做一个本质的介绍。变量的实质就是一个可操作的空间,且变量的变是体现在该存储空间中所存储的地址所对应的值是可变的。比如举一个例子来说吧:现在不管打开任意一款游戏,而这款游戏中将会难免产生一些临时的数据,将会在内存中临时存储,随着游戏的不断进行,则衡量某一标准的数据随时会发生改变,因此这时随时发生变化的数据将会在内存中存储,这个时候为了确保这个可变数据所存储的地方,因此就有了变量。 【注:有些人会产生一种疑惑,问,内存不都是临时存储吗?如果这一进程结束之后,下一次进来的时候你怎么知道这个数据所存储的地址?而且这个地址并不是固定不变的,而是随机分配,你咋能确保这个地址就是呢?所以我估计对一个初学者来说会有这样的疑问吧!这个时候就会出现一个变量地址表,而是自动查找,因为这个时候你已经给了一个变量的名字了,所以就不必担心以上所出现的问题。】 指针实际上也是变量,它里面存储的实际是内存中的一个地址。打个比方吧:假如你是小明,我想找你本人的时候,这时我刚好知道你的家庭住址,那么我就可以通过你的家庭住址来找你。指针就好比小明的家庭住址,也可以说是一个间接的量吧。例如:int *p; 定义了一个指向整型的指针变量p,如果没有这个*,这就是定义了一个整型的变量,*p就是取值,把p所指向的地址空间里面的内容取出来。 例: #include

C++中引用和指针

微笑、不失礼 提交于 2020-02-05 00:51:40
C++中使用指针的优点 1.指针能够有效的表示数据结构; 2.能动态分配内存,实现内存的自由管理; 3.能较方便的使用字符串; 4.便捷高效地使用数组; 5.指针直接与数据的储存地址有关。比如:值传递不如地址传递高效, 因为值传递先从实参的地址中取出值,再赋值给形参代入函数计算;而指 针则把形参的地址直接指向实参地址,使用时直接取出数据,效率提高,特别在频繁赋值等情况下(注意:形参的改变会影响实参的值!) 引用与指针的区别 1.从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。 2.从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空 3.从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。 4

JVM 完整深入解析

末鹿安然 提交于 2020-02-04 22:17:58
工作之余,想总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1, 64 位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中

Go 系列教程 —— 第 15 部分:指针

ぃ、小莉子 提交于 2020-02-04 21:45:11
什么是指针? 指针是一种存储变量内存地址(Memory Address)的变量。 如上图所示,变量 b 的值为 156 ,而 b 的内存地址为 0x1040a124 。变量 a 存储了 b 的地址。我们就称 a 指向了 b 。 指针的声明 指针变量的类型为 *T ,该指针指向一个 T 类型的变量。 接下来我们写点代码。 package main import ( "fmt")func main() { b := 255 var a *int = &b fmt.Printf("Type of a is %T\n", a) fmt.Println("address of b is", a) } 在线运行程序 & 操作符用于获取变量的地址。上面程序的第 9 行我们把 b 的地址赋值给 *int 类型的 a 。我们称 a 指向了 b 。当我们打印 a 的值时,会打印出 b 的地址。程序将输出: Type of a is *int address of b is 0x1040a124 由于 b 可能处于内存的任何位置,你应该会得到一个不同的地址。 指针的零值(Zero Value) 指针的零值是 nil 。 package mainimport ( "fmt")func main() { a := 25 var b *int if b == nil { fmt.Println("b is",

C语言之指针理解篇----防备忘

梦想与她 提交于 2020-02-04 21:16:06
C语言之指针理解篇----防备忘 指针这个东西,ε=(´ο`*)))唉! 指针变量是占用存储空间的。 int *a;这个东西是占用内存空间的,至于占用多少,自己去用sizeof去算。 定义个指针变量之后,它必须先指向一个地址,才能往它指向的地址里放数值。 还有下面这个东西: void fun ( int * a , int * b ) { a = b ; } int main ( ) { int * a = NULL ; int b = 10 ; fun ( a , & b ) ; printf ( "%d \n" , a ) ; //输出为0,也就是仍然指向NULL } 这里我一直以为,a这个指针变量就成了b所在的地址呢,原来不是! 进入这个fun这个函数,相对于指针变量来说,仍然是【传值调用】,所以a不会变。 void fun ( int a , int b ) { a = b ; } int main ( ) { int a = 1 ; int b = 10 ; fun ( a , b ) ; printf ( "%d \n" , a ) ; //结果仍为1,不为10 } 这个两段代码,其实都是一个道理。请谨记! 来源: CSDN 作者: 秋山刀名鱼丶 链接: https://blog.csdn.net/qq_26039331/article/details

指针变量、普通变量、内存和地址的全面对比

邮差的信 提交于 2020-02-04 20:02:25
本篇文章,将提到4个概念: 1、普通变量 2、指针变量 3、内存(内存空间) 4、地址 我们先看内存是什么?内存是实实在在的硬件,可以存放数据!在我们的一块可编程的芯片的内部有大把的内存。 形象一点,内存就像一个个的小格子,每个格子的大小是一个字节,可以存放一个字节的数据。 那这么多内存如何区分呢?那就得靠地址。地址是内存的标识,每一个地址都对应一个内存。所以内存和地址是一一对应密不可分的。 接着看,什么是普通变量? 如 char a; 就是一个普通变量。普通变量a其实是语言本身创造了,是为了更方便的表示内存。我们对a进行访问其实就是直接对内存进行访问。至于a表示的内存的地址是多少,程序员一般不用关心。编译器会自动分配地址,也就是常说的为a分配一个地址。如果想知道a的地址也可以通过&a得知。 再看指针变量,他和普通变量的区别在于,普通变量是和一块内存空间关联。而指针变量却是和两块内存空间想关联: 1、保存指针变量本身的空间,这个空间大小是固定的,32位系统中是4个字节。 2、指针指向的内存空间。 如char* a; 指针变量a,他本身需要一个空间,也就是上面说的(1)。 而(1)这个空间存放的内容是另一个内存空间的首地址。指针变量可以通过改变自己去访问其他地方的内存空间。 如果说普通变量有两种形态: 1、a 表示一块内存空间 2、&a 表示当前内存空间的地址

发一篇关于 数组名称 和 指针区别 的专题探讨

99封情书 提交于 2020-02-04 20:01:11
char p_arr[] = " p_arr : hello world " ; 声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值时一个常量 ,指向这段空间的起始位置。 数组名是符号地址常量 ( 一个常量指针,这个值不能被改变 ) ,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以可以认为程序没有给他分配空间,数组名只是代表了那个数组空间; 与指针不一样,指针指向一块空间, 同时指针本身也存储在某个空间 ;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;p_arr和&p_arr值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异. 引用chinaunix上一个叫dump_crash会员的发言: C专家编程里解释的很好: 经典的错误:在一个文件定义了数组,却在另外一个文件声明其为指针。代码如下: /*File name: main.c*/ extern int* array; /*声明指针*/ int main(void) { array[0]=1; /*用指针访问数据*/ return 0; } /*File name: def.c*/ int array[5]={0}; /*定义的却是数组*/ 1。编译器对数组名和指针变量的处理方式

c语言函数指针

人盡茶涼 提交于 2020-02-04 11:26:13
1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。 例如我们设计一个estimate() 的函数计算一个程序运行的时间,但不同的人估算时间的时候可能算法有所不同,算出的时间也应该不同。但我们都调用同一个estimate() 函数,现在该怎么办呢,重写estimate() 函数固然是一个办法,但是我们还有另外的办法,比如我们 把estimate()函数中计算时间的算法作为一个公共变量让其作为参数传入 ,我们只需要把 各自的计算时间的算法写成一个函数,再通过参数传递给estimate() ,而estimate()中的内容还是原来的不变,这样就可以实现不同的人计算出来的时间不同了。 2.既然知道了函数参数传递的用处,那么我们现在就来说一下它的用法。 首先参数传递分为两种,一种是 值传递 ,一种是 地址传递 。 一般我们传递时用的是地址传递。因为,若是采用值传递的话,比如我们传递一个数组 double a[100] ,则在调用函数的时候。编译器会 把这整个数组复制到函数中 ,这样使用的空间是 100*sizeof(double)=800 .若是我们只传递 数组名 a 这个地址 的话

iOS 内存管理

℡╲_俬逩灬. 提交于 2020-02-04 03:58:51
本篇随笔记录的是看唐巧写的「iOS开发进阶」书籍的「理解内存管理」知识点汇总,这里分享给大家。 Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式。引用计数分为自动引用计数「ARC: Automatic Reference Counting」和手动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC。 1. 引用计数的原理是什么? 当我们创建一个新对象时,他的引用计数为1; 当有一个新的指针指向这个对象时,他的引用计数就加1; 当对象关联的某个指针不再指向他时,他的引用计数就减1; 当对象的引用计数为0时,说明此对象不再被任何指针指向,这时我们就可以将对象销毁,回收内存。 由于引用计数简单有效,除了 Objective-C 语言外,Microsoft 的 COM「Component Object Model」、C++11(基于引用计数的智能指针 share_prt)等语言也提供了基于引用计数的内存管理方式。 举个例子: 新建工程,Xcode 默认开启的是 ARC,我们这里针对「AppDelegate.m」文件使用 MRC,进行以下配置: 选择目标工程,然后在「Build Phases」的