指针

C++ const关键字

冷暖自知 提交于 2020-03-02 07:47:16
文章目录 基本用法 const与指针 const与引用 const 写在函数体{}前 基本用法 const用来声明一个常量,常量被初始化后它的值就固定了,不再允许修改: const int Month = 12 ; const与指针 const用于指针有三种形式: 让指针指向一个常量对象,防止指针修改所指向的值,例如: int age = 39 ; const int * pt = & age ; //声明指向常量的指针 上面的代码声明了一个指向 const int 类型的变量,因此不能用pt来修改该值,即*pt的值为const,不能被修改。 不能使用pt来修改age的值,但是可以直接修改age的值,因为age是常规变量,没有const修饰: * pt = 20 ; //错误 age = 20 ; //正确 对应const 修饰的变量来说只能赋值给“指向常量的指针”,不能赋值给常规指针: const float g_earth = 9.8 ; const float * pe = & g_earth ; //正确 float * pt = & g_earth ; //错误 声明指针本身为常量,防止改变指针所指向的位置 、 int sloth = 3 ; int * const finger = & sloth ; 上面的声明中finger只能指向sloth

C语言学习笔记<八>

别来无恙 提交于 2020-03-02 06:40:14
通过使用联合可以用不同的方式操作内存中同一段区域。 计算机中存储数据的方式有两种,把低位数据存储在低地址字节中的方式叫做小端存储方式,相反就叫大端存储方式,我们的计算机采用的是小端存储方式。 使用枚举类型可以把一组名称转换成整数,从数字0开始。 堆里的变量的生命周期是由程序员来管理的, 可以使唤用C语言提供的函数对堆中的变量进行管理,为了使用这些函数需要包含头文件stdlib.h。 malloc函数可以从堆中分配指定个数的连续字节把首字节地址返回。如果失败则返回NULL . free 函数可以把堆中的变量释放掉,需要首字节地址作为参数。 calloc 函数也可以从堆中分配变量,并且保证把变量都清0. realoc 函数可以调整一段已经分配好的内存空间的大小。如果失败返回空地址。特殊情况下操作效果类似于malloc 或free.0 const 指针有两种声明方法 const int *p_value; int * const p_value; 前一种指针表示的整数变量不可以被修改 后一种指针表示的指针变量本身不可以被修改。 二级指针变量用来记录一级指针变理的地址,声明方法如下 int **pp_value; 二级指针变理可以用来表示它自己和对应的一级指示变量以及整数变量,使用方法如下 pp_value 表示二级指针 *pp_value 表示对应的一级指针。 **pp_value

指针知识(三):指针与数组

半城伤御伤魂 提交于 2020-03-02 06:17:56
数组的概念与指针的概念联系非常解密。其实 数组的标识 相当于它的 第一个元素的地址 ,如:int a[5],数组名a指向它的第一个元素a[0]的地址。 有语句如下: int a[5]; int * p; 下面的赋值为合法的: p = a; 这里指针p 和a 是等价的,它们有相同的属性,唯一的不同是我们可以给指针p赋其它的数值,而a 总是指向被定义的5个整数组中的第一个。所以,p只是一个普通的指针变量,而与之不同,a 是一个指针常量(constant pointer),数组名的确是一个指针常量。因此虽然前面的赋值表达式是合法的,但下面的不是: a = p; 因为a 是一个数组(指针常量),常量标识不可以被赋其它数值。 由于变量的特性,以下例子中所有包含指针的表达式都是合法的: #include <iostream> using namespace std; int main() { int a[5]; int *p; p = a;      //p是a[0]的地址,因a指向a的首地址,即指向a[0], *p = 10;    //即a[0]=10 p++; *p = 20;   //a[1]=20 p = &a[2]; *p = 30;   //a[2]=30; p = a +3; *p = 40;    //a[3]=40 p = a; *(p+4) = 50; //a[4]=50

leetcode-链表

点点圈 提交于 2020-03-02 04:28:40
这两题链表都是关于反转的 206.反转链表 1.用三个指针 Java跟c不同,没有指针的概念,所以访问下一个是用.next的方式。java的空为null 注意空指针问题,链表末端只有一个空值,指向空值.next会发生错误。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList ( ListNode head ) { if ( head == null || head . next == null ) return head ; else { ListNode a , b , c ; a = head ; b = a . next ; c = b . next ; a . next = null ; if ( c == null ) { b . next = a ; a . next = null ; } else { while ( c != null ) { b . next = a ; a = b ; b = c ; c = c . next ; } b . next = a ;

C语言文件操作详解

限于喜欢 提交于 2020-03-02 04:13:23
C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志               ftell 了解文件指针的当前位置       文件定位函数 rewind 反绕              

P2414 [NOI2011]阿狸的打字机 · AC自动机 + fail树 + 树状数组

独自空忆成欢 提交于 2020-03-02 04:09:40
题解 学习来源1 · 大佬博客直通车 学习来源2 · 大佬博客直通车 学习来源3 · 大佬博客直通车 在ac自动机里, 如果字符串a可以通过fail指针指向字符串b,那么就说明a串中包含b串 问y串中有多少个x串,等同于问: y中有多少个节点的fail指针直接或间接指向x的末尾节点 可以看到主要是根据fail进行跳转, 建立ac自动机后,以fail的角度看,其构造形似是一颗树,建立起以fail为关系的树,现在我们把它就做fail树,其性质有: 一个字符串的后缀中有一个字符串等价fail树中一个节点的子树中有另一个节点 ,也就是看一个点在Trie中到根节点的路径上有多少个属于那个点的Fail树。 再看一遍题目,现在问题等价于: 统计x的子树中来自y的节点的个数, 而实际的答案就是 fail树上x串末尾点的子树与Trie树上x到y的树链的交集中点的个数 由于在一颗树中,一个节点及其子树在DFS序中是连续的一段 ,那么我们可以用一个 树状数组 来维护答案 所以,大致步骤如下: 根据ac自动机建立fail树, dfs求出每个串的起始位置和末尾位置,这将用于树状数组区间求和 保存每个问题对应的串和编号, 再跑一遍trie树,当遍历到代表y串的节点时,查询 tire树中 root - y 的路径上,有多少个节点属于fail树中x的子树 我终于会了… # include <bits/stdc++

Change Unidirectional Association to Bidirectional

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 02:41:53
Summary :两个类都需要使用对方特性,但其间只有一条单向连接。 添加一个反向指针,并使修改函数能够同时更新两条连接。 动机: 开发初期,你可能会在两个类之间建立一条单向连接,使其中一个类可以引用另一个类。随着时间推移,你可能发现被引用类需要得到其引用者以便进行某些处理。也就是说它需要一个反向指针。但指针是一种单向连接,你不可能反向操作它。通常你可以绕道而行,虽然会耗费一些计算时间,成本还算合理,然后你可以在被引用类中建立一个函数专门负责此行为。但是,有时候想绕过这个问题并不容易,此时就需要建立双向引用关系,或称为反向指针。如果使用不当,反向指针很容易造成混乱;但只要你习惯了这种手法,它们其实并不是太复杂。 “反向指针”手法有点棘手,所以在你能够自如运用之前,应该由相应的测试。通常我不花心思去测试访问函数,因为普通访问函数的风险没有高到需要测试的地步,但本重构要求测试访问函数,所以它是极少数需要添加测试的重构手法之一。 本重构运用反向指针实现双向关联。其他技术(例如连接对象)需要其他重构手法。 做法: 1. 在被引用类中增加一个字段,用以保存反向指针。 2. 决定由哪个类 — 引用端还是被引用端 — 控制关联关系 3. 在被控端建立一个辅助函数,其命名应该清楚指出它的有限用途。 4. 如果既有的修改函数在控制端,让它负责更新反向指针。 5. 如果既有的修改函数在被控端

C++复习知识点总结(二)

独自空忆成欢 提交于 2020-03-02 01:15:28
一:C++多态与虚函数 1:基类的指针也可以指向派生类对象 People *p = new People(“王志刚”, 23) p = new Teacher(“赵宏佳”, 45, 8200);//指向派生类对象 调用函数时会出错(people的函数中没有第三项,及8200的数据),即当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数 基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。即:virtual 类型 函数名 对于派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。 2:虚函数注意事项及条件 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。 基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();

c语言文本局部修改

好久不见. 提交于 2020-03-02 01:03:55
文章目录 一、借助新建文件 二、文件指针定位覆盖 1. 得到待修改的数据在文件中的位置 2. 将文件内部指针定位到该位置 3. 写入新数据到文件 两种方法修改局部数据 一、借助新建文件 //已在内存中修改过单行数据后直接调用该函数 void RebuildFile ( List a ) //List为结构体指针,指针a指向已修改部分链表 { int num1 ; char name1 [ 100 ] ; double source ; FILE * p1 = fopen ( "...\\date.txt" , "r" ) ; FILE * p2 = fopen ( "...\\date2.txt" , "w+" ) ; //新建date2.txt while ( fscanf ( p1 , "%d%s%lf" , & num1 , name1 , & source ) == 3 ) { if ( strcmp ( a -> name , name1 ) ) //未修改部分直接存入 fprintf ( p2 , "%d %s %.2lf\n" , num1 , name1 , source ) ; else fprintf ( p2 , "%d %s %.2lf\n" , a -> num , a -> name , a -> source ) ; //修改后数据存入 }

(六)boost库之内存管理shared_ptr

安稳与你 提交于 2020-03-01 23:45:22
1、shared_ptr的基本用法 boost::shared_ptr< int > sp( new int (10)); //一个指向整数的shared_ptr assert(sp.unique()); //现在shared_ptr是指针的唯一持有者 boost::shared_ptr< int > sp2 = sp; //第二个shared_ptr,拷贝构造函数 assert(sp == sp2 && sp.use_count() == 2); //两个shared_ptr相等,指向同一个对象,引用计数为2 *sp2 = 100; //使用解引用操作符修改被指对象 assert(*sp == 100); //另一个shared_ptr也同时被修改 sp.reset(); //停止shared_ptr的使用,引用计数减一 assert(!sp); //sp不再持有任何指针(空指针) assert(sp2.use_count() == 1); //sp2引用计数变为1 sp.reset( new int (20)); //sp管理一个新对象 assert(*sp == 20); 2、应用于标准容器 有两种方式可以将shared_ptr应用于标准容器(或者容器适配器等其他容器)。 一种用法是将容器作为shared_ptr管理的对象,如shared_ptr<list<T> >