指针

const 指针与指向const的指针

微笑、不失礼 提交于 2019-12-27 02:26:57
const 指针与指向const的指针 当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int * p; (推荐) int const* p; 第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。 第二种很容易被理解成是p是一个指向 int 的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。 再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法 int * const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化) 这种形式可以被理解为,p是一个指针,这个指针是指向 int 的const指针。它指向的值是可以被改变的如*p=3; 还有一种情况是这个指针本身和它指向的内容都是不能被改变的,请往下看。 const int * const p=一个地址; int const* const p=一个地址;

剑指Offer——链表中倒数第K个节点

随声附和 提交于 2019-12-27 01:02:12
1、题目描述    输入一个链表,输出该链表中倒数第k个结点。 2、代码实现 package com.baozi.offer; /** * @author BaoZi * @create 2019-07-11-15:38 */ public class Offer11 { public static void main(String[] args) { Offer11 offer11 = new Offer11(); ListNode l1 = new ListNode(1); ListNode l2 = new ListNode(2); ListNode l3 = new ListNode(3); ListNode l4 = new ListNode(4); ListNode l5 = new ListNode(5); ListNode l6 = new ListNode(6); l1.next = l2; l2.next = l3; l3.next = l4; l4.next = l5; l5.next = l6; l6.next = null; ListNode reslut = offer11.FindKthToTail(l1, 4); ListNode temp = reslut; while (temp != null) { System.out.println

go基础之--函数和map

我的未来我决定 提交于 2019-12-27 00:29:46
在整理函数之前先整理一下关于指针 指针 普通类型变量存的就是值,也叫值类型。指针类型存的是地址,即指针的值是一个变量的地址。 一个指针指示值所保存的位置,不是所有的值都有地址,但是所有的变量都有。使用指针可以在无序知道 变量名字的情况下,间接读取或更新变量的值。 获取变量的地址,用&,例如:var a int 获取a的地址:&a,&a(a的地址)这个表达式获取一个指向整形变量的指针,它的类型是整形指针(*int),如果值叫做p,我们说p指向x,或者p包含x的地址,p指向的变量写成 *p ,而*p获取变量的值,这个时候*p就是一个变量,所以可以出现在赋值操作符的左边,用于更新变量的值 指针类型的零值是nil 两个指针当且仅当指向同一个变量或者两者都是nil的情况才相等 通过下面小例子进行理解指针: 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func test() { 8 x := 1 9 // &x 获取的是变量x的地址,并赋值给p,这个时候p就是一个指针 10 p := &x 11 // p是指针,所以*p获取的就是变量的值,指针指向的是变量x的值,即*p为1 12 fmt.Println(*p) 13 // 这里*p 进行赋值,也就是更改了变量x的值,即实现不知道变量的名字更改变量的值 14 *p = 2 15 fmt.Println

KMP算法

℡╲_俬逩灬. 提交于 2019-12-27 00:02:17
KMP算法 在介绍KMP算法之前,先介绍一下BF算法。 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa   BF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟: a babcababa 第二趟:a b abcababa 第三趟:ab a bcababa 第四趟:aba b cababa 第五趟:abab c ababa a ba ba a b aba ab a ba aba b a abab a j=0 j=1 j=2 j=3 j=4(i和j回溯) i=1 i=2 i=3 i=4 i=3 第六趟:a b abcababa 第七趟:ab a bcababa 第八趟:aba b cababa 第九趟:abab c ababa 第十趟:aba b cababa a baba a baba a b aba ab a ba a baba j=0 j=0 j=1 j=2(i和j回溯) j=0 i=4 i=5 i=6 i=7 i=8 第十一趟:abab c ababa 第十二趟:ababc a baba 第十三趟

12-26学习随笔:指针和内存

爱⌒轻易说出口 提交于 2019-12-26 23:40:44
12-26学习随笔:指针和内存 内存: 系统存储空间,32位系统通常为8个字节的内存地址 指针: 指针是一个变量,如同int a 类似,指针存储内容为地址。 如申明 int p; 那么变量为p,而不是 p; 指针声明: 指针变量的数据类型用来指定该指针所指向变量的类型(指针类型和所指向的变量类型相同): char *p; int *p; float *p; 空指针可以指向任意类型,执行指向类型后将强制转换: void *p; 指针赋值: 初始化赋值: int a=100; int *p=&a; 后期赋值 int a=100; int p; p=&a; 指针基本使用: 指针所指向地址+1: p+=1; 对于32位系统,指针+1代表内存地址+4(4 8); 取指向地址的值: int b; b=*p; 来源: CSDN 作者: 后海看海 链接: https://blog.csdn.net/liujieupup/article/details/103720622

go 结构的方法总结

99封情书 提交于 2019-12-26 23:04:39
方法可以与命名类型或命名类型的指针关联。 刚刚看到的两个 Abs 方法。一个是在 *Vertex 指针类型上,而另一个在 MyFloat 值类型上。 有两个原因需要使用指针接收者。首先避免在每个方法调用中拷贝值(如果值类型是大的结构体的话会更有效率)。其次,方法可以修改接收者指向的值。 尝试修改 Abs 的定义,同时 Scale 方法使用 Vertex 代替 *Vertex 作为接收者。 当 v 是 Vertex 的时候 Scale 方法没有任何作用。`Scale` 修改 `v`。当 v 是一个值(非指针),方法看到的是 Vertex 的副本,并且无法修改原始值。 Abs 的工作方式是一样的。只不过,仅仅读取 `v`。所以读取的是原始值(通过指针)还是那个值的副本并没有关系。 package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} v.Scale(5) fmt

数据结构与算法 — 链表

偶尔善良 提交于 2019-12-26 21:58:27
链表 (通过“指针”将一组零散的内存块串联起来使用。) 三种常见链表结构: 单链表:链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。如图所示,我们把这个记录下个结点地址的指针叫做后继指针next 如图所示,你会发现,其中有两个结点比较特殊,他们分别是第一个结点和最后一个结点。我们习惯把第一个结点叫做头结点,把最后一个结点叫做尾结点。其中,头结点用来记录链表的基地址。有了它,我们可以遍历得到整条链表。而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址NULL,表示这是链表上最后一个结点。与数组一样,链表也支持数据的查找、插入和删除操作。我们知道,进行数组的插入,删除操作时,为了保持内存的连续性,需要做出大量的数据搬移,所以时间复杂度是O(n)。而在链表中插入或者删除一个数据,我们并不需要为了保持内存的连续性而搬移结点,图中可以看出,针对链表的插入和删除操作,我们只需要考虑相邻结点的指针改变,所以对应时间复杂度是O(1)。 但是有利也有弊。链表想要随机访问第K个元素,就没有数组高效了。因为链表中的数据并非连续存储的,所以无法像数组那样,根据首地址和下标,通过寻址公式就能计算出内存地址,而是需要根据指针一个结点一个结点地依次遍历,直到找到对应的结点。所以

编写高质量代码——“零星”总结

空扰寡人 提交于 2019-12-26 21:25:19
不要让main函数返回void //在C++中绝对没有出现过 void main(){ } 这种函数定义,在C语言中也是。 //两种 main 的定义方式: int main( void ); // int main( int argc, char** argv ) //第一版的C语言中仅仅有 int 一种数据类型。为了兼容 须要,不明白标明返回值的。默觉得 int //在main函数中,return 语句的作用在于离开main函数( 析构掉全部具有动态生存时间的对象 ),并将其返回值作为參数来调用 exit 函数。假设运行到main结束处时,没有遇到return语句,编译器会隐式加上return 0。该规则只对 main 函数适用。 ============================================ 区分0的4种面孔 // 整型0、空指针NULL、字符串结束标志 '\0'、逻辑FALSE/false //'\0' 是一个字符,只占 8 位,二进制为 0000 0000。由于字符类型中没有与 0000 0000 相应的字符,故在C/C++中,'\0' (转义字符)被作为字符串结束标志适用,具有唯一性,与 '0' 是有差别的。 //FALSE是C的宏定义,是 int 类型;false是C++的keyword。是 bool 类型,仅仅占一个字节。 ========

空指针异常错误集

故事扮演 提交于 2019-12-26 19:54:52
1.dataManager中当get什么玩意儿空指针的时候,很可能是没有初始化,就算全局变量在别的地方初始化了,这里也需要调用。 2.加载图片出错 this.mImageLoader.get(imgUrl,listener); 三个对象都有值,可是报空指针。 要看ImageLoader创建的时候需要使用的对象是否为空。 #我出过这样的错,问题竟然是地址没有写“:”,粗心害死人! 3.空指针 加载view的时候空指针,不只要看find到的是不是对应的控件,还要看set的页面有没有错。 4.异步方法调用之前要初始化!异步就是自己做自己的,所以你得给他初值啊。否则会空指针的。尤其记得mData(List)和requestQueue。 adapter不用担心,他变化完成时会调用notifyChanged方法告诉主线程。 来源: https://www.cnblogs.com/fanerblog/p/4847404.html

指针

旧巷老猫 提交于 2019-12-26 18:20:53
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。 为什么需要指针? 指针解决了一些编程中基本的问题。 第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果, 但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。 第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。 第三,有些操作必须使用指针。如操作申请的堆内存。还有: C语言中的一切函数调用中,值传递都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。 指针是什么? 我们指知道:C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。