指针

C++类的六个特殊成员函数

有些话、适合烂在心里 提交于 2020-02-24 21:07:36
1.设置六个函数的参数,先让函数运行起来 // // Created by liuhao on 20-1-1. // //================================================================================= #include <iostream> //using namespace std; class Stu { private: std::string name = "无名氏 "; int age = 0; int *d = nullptr; public: Stu() { std::cout << name << age << " 执行了无参构造函数!" << std::endl; }; Stu(int a) { std::cout << name << age << " 执行了有参构造函数!" << std::endl; }; Stu(const Stu &s) { std::cout << name << age << " 执行了拷贝构造函数!" << std::endl; }; Stu &operator=(const Stu &s) { std::cout << name << age << " 执行了拷贝赋值运算符函数!" << std::endl; }; Stu(Stu &&s) {

PHP函数-文件系统函数

那年仲夏 提交于 2020-02-24 18:48:43
basename 返回文件路径中基本的文件名 chgrp 改变文件所属的组,如果操作成功则返回 True,否则返回 False chmod 更改指定文件的模式,如果操作成功则返回 True,否则返回 False chown 更改指定文件的所有者,如果操作成功则返回 True,否则返回 False clearstatcache 清除文件缓存 copy 将某文件由当前目录复制到其他目录,如果成功则返回 True,失败则返回 False dirname 返回去掉文件名后的目录名 disk_free_space 根据相应的文件系统或磁盘分区返回可用的字节数 disk_total_space 根据相应的文件系统或磁盘分区返回总共的字节数 fclose 关闭指定文件标识指针所指的文件 feof 如果文件指针指向文件最后或出错则返回 True,否则返回 False fflush 强制将所有缓冲的输出写入到指定的文件标识所指向的资源.成功返回 True,失败返回 False fgetc 获取文件指针处的字符并返回,如果当前指针在文件尾则返回 False fgetcsv 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组 fgets 获取文件指针所在行指定长度的内容 fgetss 获取文件指针所在行指定长度的内容,并去掉其中的 HTML 标记和 PHP 标记 file

删除排序数组中的重复项

£可爱£侵袭症+ 提交于 2020-02-24 14:01:29
#目的:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 ##思路:首先可以用两个指针,一个指向前面一个,一个指向后面一个,用一个循环让第二个指针使用全部元素,比较两个指针的元素,若相同就赋值给第一个指针直到循环结束。 class Solution { public : int removeDuplicates ( vector < int > & nums ) { if ( nums . size ( ) == 0 ) return 0 ; int i = 0 ; for ( int j = 1 ; j < nums . size ( ) ; j ++ ) { if ( nums [ i ] != nums [ j ] ) { i ++ ; nums [ i ] = nums [ j ] ; } } return i + 1 ; } } ; 来源: CSDN 作者: Ralo__ 链接: https://blog.csdn.net/weixin_46382378/article/details/104466998

数据结构与算法分析:(三)链表(上)

让人想犯罪 __ 提交于 2020-02-24 13:54:32
一、什么是链表? 链表是一种物理上 非连续 、 非顺序 的存储结构,数据元素之间的顺序是通过每个元素的 指针 (类似C语言中的指针,Java中是引用)关联的。 链表由一系列节点组成,每个节点一般至少会包含两部分信息:一部分是元素数据本身,另一部分是指向下一个元素地址的“指针”。这样的存储结构让链表相比其他线性的数据结构来说,操作会复杂一些。 说到链表,我们经常拿来与数组比。我们先看下面一张图再来对比它们的各自的优劣。 从图中我们看到,数组需要一块 连续 的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。 这里先思考一下下面这个问题。 Q:数组在实现上为什么使用的是连续的内存空间? A:可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 Q:上一答案中CPU缓存机制指的是什么?为什么就数组更好了? A: CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中

双指针

房东的猫 提交于 2020-02-24 10:38:06
《详解二分查找算法》 https://www.cnblogs.com/kyoner/p/11080078.html 《双指针技巧汇总(转)》 https://blog.csdn.net/xxdddail/article/details/93735314 《算法 | 双指针套路总结》 https://zhuanlan.zhihu.com/p/95747836 来源: CSDN 作者: LawssssCat 链接: https://blog.csdn.net/LawssssCat/article/details/104471758

C++之对象指针

谁说我不能喝 提交于 2020-02-24 07:40:08
对象指针定义形式: 类名 *对象指针名; Point a ( 5 , 10 ) ; Piont * ptr ; ptr = & a ; 通过指针访问对象成员: 对象指针名->成员名 ptr - > getx ( ) 相当于 ( * ptr ) . getx ( ) ; 例: 使用指针来访问Point类的成员 # include <iostream> using namespace std ; class Point { public : Point ( int x = 0 , int y = 0 ) : x ( x ) , y ( y ) { } int getX ( ) const { return x ; } int getY ( ) const { return y ; } private : int x , y ; } ; int main ( ) { Point a ( 4 , 5 ) ; Point * p1 = & a ; //定义对象指针,用a的地址初始化 cout << p1 - > getX ( ) << endl ; //用指针访问对象成员 cout << a . getX ( ) << endl ; //用对象名访问对象成员 return 0 ; } 结果为: 4 4 this指针: 指向当前对象自己 来源: CSDN 作者: 北木. 链接: https:/

【整理】句柄.内核对象

人走茶凉 提交于 2020-02-24 05:53:08
  句柄是一个标识符,是拿来标识对象或者项目的。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是驻留在内存中的。 C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。 资源的大小取决于使用的硬件和操作系统,但其大小总是足以包含系统的指针(因此也可以包含资源的名称)。 内核对象    内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。 有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如,进程对象有一个进程 I D 、一个基本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。    内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容 。 Microsoft 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使 Microsoft 能够在不破坏任何应用程序的情况下在这些结构中添加、 删除和修改数据成员。 内核对象包括 如下

关于数组和指针作为参数时遇到的问题

≡放荡痞女 提交于 2020-02-23 19:09:04
自己在实现一个类strcpy函数时,发现一些小问题: 首先,函数如下: char *str_n_cpy(char *dest,const char *src) { char *_temp = dest; assert(dest != NULL || src !=NULL); //注意越界 printf("%d",sizeof(dest)); while((*dest++ = *src++) != '\0'); return _temp;}   main函数如下: int main() { char *str1 = "123"; char *str2 = "4567"; printf("%s\n",str_n_cpy(str1,3,str2,3)); return 0; }   运行程序会发现程序崩溃,后来在main函数中把char *str1 = "123"改成char str1[3]={"123"};会发现程序就能正常运行,为什么会这样呢? 经查知,前者实际将str1指向一个常量”123“了,即此时的str1是一个常量指针,其中的内容固然不可改变,所以赋值操作不能进行了;而后者str1实际作为一个普通的char型指针传到函数中,自然可以进行赋值操作。 来源: https://www.cnblogs.com/wangkundentisy/p/4202027.html

C++内存管理转自http://soft.yesky.com/lesson/110/2381610.shtml

拈花ヽ惹草 提交于 2020-02-23 15:04:50
转自 http://soft.yesky.com/lesson/110/2381610.shtml 踏入C++中的雷区——C++内存管理详解 2006-04-25 09:22 作者:蒋涛 出处:计算机教学网 责任编辑:方舟   伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。    1、内存分配方式   内存分配方式有三种:   (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。    2

LeetCode 力扣 76. 最小覆盖子串

自闭症网瘾萝莉.ら 提交于 2020-02-23 11:51:19
题目描述(困难难度) 给两个字符串,S 和 T,在 S 中找出包含 T 中所有字母的最短字符串,不考虑顺序。 解法一 滑动窗口 没有想出来,直接看来了 题解 ,这里总结一下。 用双指针 left 和 right 表示一个窗口。 right 向右移增大窗口,直到窗口包含了所有要求的字母。进行第二步。 记录此时的长度,left 向右移动,开始减少长度,每减少一次,就更新最小长度。直到当前窗口不包含所有字母,回到第 1 步。 S = "ADOBECODEBANC" , T = "ABC" A D O B E C O D E B A N C //l 和 r 初始化为 0 ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r //此时窗口中包含了所有字母(ABC),停止移动 r,记录此时的 l 和 r,然后开始移动 l A D O B E C O D E B A N C ^ ^ l r //向后移动 l,减小窗口,此时窗口中没有包含所有字母(ABC)