指针

指针变量和普通变量的值

白昼怎懂夜的黑 提交于 2020-02-23 11:23:02
指针变量有3个值,自己的地址,保存的地址和保存地址内的值 #include <cstdio> int main(){ int a=10; int *p=&a; printf("p的地址:%p\n",&p); printf("p保存的地址:%p\n",p); printf("p保存地址内的值:%d\n",*p); return 0; } 普通变量有2个值,自己的地址,自己的值 #include <cstdio> int main(){ int a=10; printf("a的地址:%p\n",&a); printf("a的值:%d\n",a); return 0; } 来源: https://www.cnblogs.com/litifeng/p/12348702.html

缓存溢出

江枫思渺然 提交于 2020-02-23 04:47:10
缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。 1. 缓存溢出攻击方式 1.1 破坏活动记录 函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指针、变量缓存区等值,它们在栈中的存放顺序如图所示。 由它们在栈中的存放顺序可知,返回地址、栈指针与变量缓存区紧邻,且返回地址指向函数结束后要执行的下一条指令。栈指针指向上一个函数的活动记录,这样攻击者可以利用变量缓存区溢出来修改返回地址值和栈指针,从而改变程序的执行流。 1.2 破坏堆数据 程序运行时,用户用C、C++内存操作库函数如malloc、free等在堆内存空间分配存储和释放删除用户数据,对内存的使用情况如内存块的大小、它前后指向的内存块用一个链接类的数据结构予以记录管理,管理数据同样存放于堆中,且管理数据与用户数据是相邻的。这样,攻击者可以像破坏活动记录一样来溢出堆内存中分配的用户数据空间,从而破坏管理数据。因为堆内存数据中没有指针信息,所以即使破坏了管理数据也不会改变程序的执行流,但它还是会使正常的堆操作出错,导致不可预知的结果。 1.3 更改函数指针 指针在C、C+

删除排序数组中的重复项

时光怂恿深爱的人放手 提交于 2020-02-22 16:31:30
删除排序数组中的重复项——c++实现 题目描述 对于数组问题首要想到指针,本题采用双指针。 将第一个指针指向数组中第一个元素,第二个指针指向数组中第二个元素,第二个指针从前往后遍历,若第一个指针与第二个指针所指元素不相同,将第一个指针向后移一位。最终返回值为第一个指针所指的元素个数加一,算法如下: 来源: CSDN 作者: weixin_45773701 链接: https://blog.csdn.net/weixin_45773701/article/details/104443070

小白算法积累——单链表25#带头结点单链表+穿插+逆置

被刻印的时光 ゝ 提交于 2020-02-22 16:07:52
题目 :设线性表L=(a1,a2,a3,…an-2,an-1,an)采用带头结点的单链表保存,链表中的结点定义如下: typedef struct node { int data; struct node*next }Node; 请设计一个 空间复杂度为O(1)且时间上尽可能高效 的算法,重新排列L中的各结点,得到线性表L’=(a1,an,a2,an-1,a3,an-2…) 关键字 :带头结点单链表+穿插+逆置 思路 :为了达到穿插+逆置的效果,我们选择 分段 + 逆置+插入 先观察L=(a1,a2,a3,…an-2,an-1,an)和L’=(a1,an,a2,an-1,a3,an-2,…) 发现L’是由L摘取第一个元素,再摘取倒数第一个元素…依次合并而成的。 为了方便链表后半段取元素,需要先将L后半段原地逆置【题目要求空间复杂度为O1,不能借助栈】,否则每取最后一个结点都需要遍历一次链表。 1)先找出链表L的中间结点,利用 速度差产生路程差法 ps:顺序表就是“直接算算地址”法了 为此设置两个指针p和q,指针p每次走一步,指针q每次走两步 当指针q到达链尾时,指针p自然就在链表的中间结点 2)将L的后半段结点原地逆置 需要变量:q的后继结点指针r,负责将“逆置指针”的工作 3)从单链表前后两段中依次各取一个结点,按要求重排。 需要变量: void change_list (

双指针---回文字符串

落爺英雄遲暮 提交于 2020-02-22 13:01:53
回文字符串 680. Valid Palindrome II (Easy) Input: "abca" Output: True Explanation: You could delete the character 'c'. 题目描述:   可以删除一个字符,判断是否能够构成回文字符串。 代码: public boolean validPalindrome(String s){ int i==-1; int j=s.length(); while(++i<--j){ if(s.charAt(i)!=s.charAt(j)){ return isPalindrome(s,i,j-1)||isPalindrome(s,i+1,j); //删除一个字符后,判断剩下的是否为回文 } } private boolean isPalindrome(String s ,int i,int j){ while(i<j){ if(s.charAt(i++)!=s.charAt(j--)) return false; } return true; } } 来源: https://www.cnblogs.com/yjxyy/p/11104408.html

【知识总结】指针

只谈情不闲聊 提交于 2020-02-22 06:17:30
1.内存和地址 (1)内存中的每个位置由一个独一无二的地址标识; (2)内存中的每个位置都包含一个值; (3)变量名字与内存地址相对应,由编译器为我们实现,变量给了我们更方便的方法记住地址(硬件仍然通过地址访问内存位置); 【注】在某些要求边界对齐(boundary alignment)的机器上,整型值存储的起始位置只能是某些特定的字节,通常是2或者4的倍数; 2.值和类型 不能简单地通过检查一个值的位来判断它的类型,判断一个值的类型(以及它的值),必须观察程序中这个值的使用方法; 3.指针变量的内容 (1)一个变量的值就是分配给这个变量的内存位置多存储的数值; (2)指针变量存储的是某块内存的地址; 4.间接访问操作符 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针(dereferencing point)。这个用于执行间接访问的 操作符是单目操作符*。 5.未初始化和非法的指针 声明一个指针并不会自动分配任何内存,在对指针执行间接访问前,指针必须进行初始化。 6.NULL指针 【注】对一个NULL指针进行解引用是非法的,在对指针解引用之前你首先必须确保它并非NULL指针。 7.指针常量 【问】如果想把25这个值存在100这个位置,该怎么办? 【答】 *(int *)100 = 25; 来源: https://www.cnblogs.com

PHP基础2

喜欢而已 提交于 2020-02-22 05:48:58
正则表达式: 定界符:/开头/结尾 ^匹配开头  $匹配结尾  *前面的表达式可以出现n次可以为0 +前面的表达式至少出现一次  ?前面的表达式可出现1或0次 {n}匹配n次  {n,}最少匹配n次 最多不限 {n,m}最少匹配n次,做多m次  x|y匹配x或y次 [xyz]匹配其中任何一个 [a-z]匹配a-z之间任何一个 \d任意一个数字  \D任意一个非数字 \s任何不可见字符  \S匹配任何可见字符 \v制表符  \w包括下划线的任意单词字符 preg_replace寻找替换  preg_split将字符串分割 preg_match匹配第一个  preg_match_all匹配所有 数组: 定义数组:$arr=array(1,2,3,4,5) 强类型语言数组特征:1.只能存储相同类型的数据           2.数组的长度固定           3.在内存里面是连续的 取值echo $arr[0] 默认从0开始 关联数组:$arr1=array(“one”=>"111","two"=>"222") 非常规定义方式: $arr2["one"]="aaa"(赋值定义) 删除数组元素 unset($arr[2]) 添加数组元素$arr[2]=10  追加元素$arr[]=10) 遍历数组: 1.for循环遍历(只能遍历索引数组) for($a=0;$a<count($arr)

22_链表中倒数第k个结点

空扰寡人 提交于 2020-02-22 05:47:17
链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 示例: 给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5. 解法: 用两个指针,让前指针往前走k步后,后指针和前指针同时往前走,直到前指针为空时停下。 遇到的问题: 在解决链表长度小于K时,将判定结束的条件写到了while中,导致secod指针还没有指向头结点。如上面找倒数第三个。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* getKthFromEnd(ListNode* head, int k) { if(head == nullptr || k < 0) return nullptr; ListNode* first = nullptr; ListNode* second = nullptr

c语言进阶6-指针

我与影子孤独终老i 提交于 2020-02-22 02:43:27
指针是c语言的一个重要组成部分 是c语言的核心、精髓所在,用好指针可以在c语言编程中起到事半功倍的效果。一方面,可以提高程序的编译效率和执行速度以及实现动态的存储分配;另一方面,使用指针可使程序更灵活,全球表示各种数据结构,编写高质量的程序。 指针是c语言显著的优点之一,其使用起来十分灵活而且能提高某些程序的效率,但是如果使用不当则很容易造成系统错误。许多程序“挂死“往往都是由于错误地使用指针造成的 一、 地址与指针 系统的内存就好比是带有编号的小房间,如果想使用内存就需要得到房间编号。图1定义了一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003. 什么是地址? 地址就是内存区中对每个字节的编号 ,如图1所示的1000/1001/1002和1003就是地址,为了进一步说明来看图2. 内存地址 内容 1000 0 变量i 1004 1 变量j 1008 2 1012 3 1016 4 1020 5 图2所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址从1000开始。因为基本整型占4个字节,所以变量j在内存中的起始地址为1004,变量i的内容是0. 那么指针又是什么呢?这里仅将 指针看作是内存中的一个地址,多数情况下,这个地址就是内存中另一个变量的位置,如图3所示。

文件操作

孤人 提交于 2020-02-22 00:44:44
文件类型 在 PHP 里面,文档类型有 7 种 ( 基于 UNIX 系统 ) ,如果是基于 Windows 系统,文件类型只有 3 种。 在 UNIX 系统下面文件类型有 7 种: fifo , char , dir , block , link , file 和 unknown 。 如下表: 文件类型 描述 fifo 命名管道,用于将信息的一个进程传递到另一个进程 char 字符设备 Dir 目录类型 Block 块设备类型 Link 符号链接,是指向文件的指针 File 普通文件类型 unknown 未知类型 在 Windows 系统下面文件类型只有 3 种: dir , file , unknown 在 PHP 里面有一个函数可以查看文件的类型 filetype() 这里补充一个 file_exists() 函数:判断文件是否存在 除此之外,还有一组判断文件是否为某一个类型的函数 is_file() is_dir() 文件属性 在操作文件的时候,我们往往需要获取文件的相关属性,例如:文件的大小,文件的创建时间,文件的访问时间 如下表:下面的函数接收的参数都是文件所在的路径 函数 功能 返回值 file_exists 判断文件是否存在 返回 true 或者 false filesize() 获取文件大小 返回字节数 filectime() 获取文件的创建时间 返回一个时间戳