指针

闲聊c/c++: 谈内存(大/小端,高/低字节,高/低地址)

强颜欢笑 提交于 2020-01-24 07:16:23
c/c++和其他语言最大区别在于: 指针 指针就是内存地址,一旦明白了指针与内存地址相关的内容,那理解其他语言,就易如反掌。 而且你可以把其他语言用的更加好,更加有效率 例如java/js/objc中为什么容器中只能存储引用类型? 如果存储基本数据类型(值类型),为什么会发生效率很低的装箱拆箱行为? 而c#为什么就不会呢? 你怎么才能让不使用的内存尽快被垃圾收集器回收过去? 还有很多涉及内存相关的内容,例如堆分配,栈分配等........ 根据经验: 如果你一开始学的是c/c++,并且有这一定的c语言运行库(crt)及stl库的使用经验,那么转其他语言基本上只要熟悉一下语法就能快速上手 如果你有几年开发经验,想更上一层楼,那么学习c/c++是必要的选择。由于有程序的经验,学习c/c++并不算很难 本篇目的: 什么是大端【Big-endian】小端【Little-endian】 搞明白大端小端(关键是理解高/低字节以及高/低地址) 大小端的定义(来自 百度百科 的定义): 大端:【高低低高|左左右右】 数据的高字节 保存在 内存的低地址 中,而 数据的低字节 保存在 内存的高地址 中 小端:【高高低低|左右右左】 数据的高字节 保存在 内存的高地址 中,而 数据的低字节 保存在 内存的低地址 中 是不是感觉很绕口啊,特难理解吧! 理解大小端的关键点是明白: 什么是高低地址

C++函数指针总结

巧了我就是萌 提交于 2020-01-24 07:05:14
  学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。   至于指针的详细学习,推荐这篇博文 C++指针详解   与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址。函数指针就是指向这个地址。函数指针所指向的类型,就是函数本身。我们知道,指针所指向类型代表了指针所指向的内存区域的大小。所以函数指针所指向的类型,就是函数在内存中所占据内存的大小。知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数完成函数调用。 一、最简单的函数指针   变量都包括声明和赋值,指针不例外,函数指针也不例外。我们来看一个简单的函数: void add(int a, int b){ cout << a + b << endl; }   一个简单的加法计算并输出到命令行的函数。   那么如何通过函数指针来调用它呢?   1、声明: void (*p1)(int a, int b);   函数指针的声明很简单,基本就是通过一个指针把函数名替换。指针p1的类型为void (*) (int a,int b),表明指针是一个指向某个函数的指针,指针指向的类型为void () (int a,int b)   2、赋值: p1 = add;   3、也可以直接定义: void (*p1)(int a,

图解AC自动机

假装没事ソ 提交于 2020-01-24 05:01:38
图解AC自动机 前言: 我们引出这样一个问题: 我想知道字符串 \(t\) 在字符串中 \(s\) 出现多少次/有没有出现? 那我们可以使用kmp算法求出 \(t\) 的next数组,之后 \(O(n)\) 匹配求解即可。 那如果把问题升级一下呢? 想知道字符串 \(t_1,t_2,...,t_n\) 在字符串 \(s\) 中出现了多少次/有没有出现? 这时候再用 \(kmp\) 算法,复杂度将达到 \(O(n^2)\) ,非常慢了。 这时候我们需要AC自动机。 AC自动机用于求解多个模式串与一个文本串的匹配问题。 AC自动机需要 提前知道所有需要匹配的字符串 。 可以想象成trie树上kmp。 开始图解: 假设说我们的模式串分别为: \(abcd,abd,bcd,cd\) 。 第一步:创建trie树 没啥好说的,建立trie就行了呗。 其中红色节点代表一个字符串的结尾。 第二步:构建失配指针(最重要的一步) 这一步的目的和kmp算法中求nex数组的目的是类似的。 对于kmp算法来说,是求next;对于AC自动机来说,是求fail指针。 \(fail(i):\) 以 \(i\) 节点为结尾的串的后缀与其他串有最大公共长度的前缀的结尾编号。 可能看到这里比较懵逼,没关系,模拟一下就好了。 首先看第一个字符串: \(abcd\) ,不存在任何一个其他子串的前缀与 \(abcd\)

C语言文件操作

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

文件已经删除,但是空间没有释放的原因

僤鯓⒐⒋嵵緔 提交于 2020-01-24 03:57:26
du -sh /tmp/* | sort -nr | head -3 通过命令发现在 /tmp 目录下有个 66G 大小的文件 access_log,这个文件应该是 apache 产生的访问日志文件,从日志大小来看,应该是很久没有清理的 apache 日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除命令, rm /tmp/access_Iog df -h 从输出来看,根分区空间仍然没有释放,这是怎么回事? 一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据,要理解这个问题,就需要知道 linux 下文件的存储机制和存储结构。 一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的 meta-data 中,在将数据删除后,这个指针就从 meta-data 中清除了,而数据部分存储在磁盘中。在将数据对应的指针从 meta-data 中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除 access_log 文件后,空间还没有释放,就是因为 httpd 进程还在一直向这个文件写入内容,导致虽然删除了 access_Ilog 文件,但是由于进程锁定,文件对应的指针部分并未从 meta-data 中清除,而由于指针并未删除,系统内核就认为文件并未被删除

LeetCode 26-删除排序数组中的重复项

二次信任 提交于 2020-01-24 03:10:53
1. 删除排序数组中的重复项 public class RemoveDuplicates26 { /**删除排序数组中的重复项 时间复杂度:O(n) i和j最多都走n步 * 例:nums = [1,1,2], 返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 * @param nums 待排序数组 * @return 数组中不重复元素个数 */ /*方法:双指针法 * 1.开始时这两个指针都指向第一个数字 * 2.如果两个指针指的数字相同,则快指针向前走一步 * 3.如果不同,则两个指针都向前走一步 * 4.当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数 */ public int removeDuplicates(int[] nums) { //数组为空 if (nums.length == 0) return 0; //数组不为空 int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[j] != nums[i]) { i++; nums[i] = nums[j]; } } return i + 1; } } 2.双指针法原理图 3.leetCode代码测试 来源: CSDN 作者: 徒伤 链接: https://blog.csdn.net/weixin

抛出类类型的异常

主宰稳场 提交于 2020-01-24 02:50:57
异常抛出后,被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 如果抛出的异常对象是一个数组,将转换为指向数组首元素的指针;如果抛出的是一个函数,则转换为指向该函数的指针。 抛出throw之后,跟在throw后面的语句不会继续执行。控制将从throw转移到匹配的catch。该catch可以是同一函数中局部的catch,也可以在直接或间接调用发生异常的函数的另一个函数中。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用throw表达式初始化一个称为异常对象(exception object)的特殊对象。异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。 异常对象通过复制被抛出表达式的结果创建,所以该表达式结果必须是可以复制的类型。 1. 异常对象与继承 在实践中,许多应用程序抛出的表达式,其类型来自某个继承层次。当抛出一个表达式时,被抛出对象的静态编译类型将决定异常对象的类型。 2. 异常与指针 如果在抛出的表达式中,对指针解引用,其类型与指针的类型匹配。如果该指针是一个指向派生类对象的基类类型指针,则那个对象将被分割,只抛出基类部分。也就是说,无论对象的实际类型是什么

指针和引用的区别

≡放荡痞女 提交于 2020-01-24 02:13:13
指针和引用都是C++中常见的概念,但是好像之前没有系统地整理过,还是有些模糊二者的区别,今天想详细地整理一下: 指针: 是一个变量,存储一个地址,指向内存的一个存储单元。 引用: 是原来变量的一个别名,实质上和原来的变量是同一个东西。 区别: 1.指针可以用const修饰,const引用只读不可改。 2.指针可以多级,但引用只有一级。(存在int**p,不存在int&&p) 3.指针的值可以为空,但是引用不可以,引用必须在定义的时候进行初始化。 4.指针在初始化之后可以改变,指向其他的存储单元,但是引用初始化后不可以改变,但是引用指向的内容可以改变。 string str1 = "a"; string str3 = "b"; string &str2 = str1; str2 = str3; 上面的例子结果,str1,str2,str3最后的值都是"b"。 5.sizeof(引用)得到引用所指向的对象的大小,sizeof(指针)得到的是指针本身的大小。 来源: CSDN 作者: Miss just 链接: https://blog.csdn.net/Missjust/article/details/103837175

父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数

徘徊边缘 提交于 2020-01-24 01:50:57
以下程序的显示结果是什么,为什么 #include <iostream> using namespace std; class CParent { public: virtual void Show() { cout<<"CParent::Show()"<<endl; } }; class CChild:public CParent { public: virtual void Show() { cout<<"CChild::Show()"<<endl; } }; void show(CParent *parent) { parent->Show(); } int main(int argc, char **argv) { CParent *p = (CParent *)new CChild; show(p); return 0; } 显示结果: CChild::Show() 解析: 如果是虚函数,是可以通过基类的指针调用子类的函数的。 如果不是虚函数基类指针就只能调用基类函数。 上面CParent类中的Show()函数前加了virtual,是虚函数,故调用子类的Show()函数 如果CParent类中的Show()函数前没有加virtual,则显示结果为“CParent::Show()”,即调用基类的Show()函数 来源: https://www.cnblogs.com

力扣142——环形链表 II

旧时模样 提交于 2020-01-24 01:47:09
原题 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。 进阶: 你是否可以不用额外空间解决此题? 原题url:https://leetcode-cn.com/problems/linked-list-cycle-ii/ 解题 在这里贴一下题目所提供的节点结构,这样下面的代码就不重复贴了: Definition for singly-linked list. class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; }