指针

蓝桥杯算法训练--指针

蹲街弑〆低调 提交于 2020-02-09 18:55:48
问题描述   你的表妹正在学习整数的加法,请编写一个程序来帮助她学习。该程序调用了一个函数GetTwoInts,由它来返回两个从键盘读入的100以内的整数,然后计算这两个整数之和,并把答案显示出来。要求:在主函数中不能使用scanf等函数直接输入这两个整数,而必须通过调用GetTwoInts函数来完成,在GetTwoInts函数中可以使用scanf函数。另外,由于该函数必须同时返回两个整数,因此不能采用函数返回值的方式,而必须采用指针的方法来实现。   输入格式:输入只有一行,即两个100以内的整数。   输出格式:输出只有一行,即这两个整数之和。 1.int *x,*y声明了指针变量,但声明指针变量时,系统虽然会自动分配一个内存空间给指针变量,但这个内存空间的地址是随机的,这个地址可能指向系统不允许访问的地址或者可用的,但是暂时没有用到的地址(譬如程序没有用到的堆栈地址)等,此时即为野指针。所以,在使用指针变量之前,应该保证指针指向一个绝对可用的空间,即初始化。 2.int a,b声明int型变量时,系统会给变量a,b分配一个可用的内存空间,将变量a,b的地址赋值给指针变量x,y,此时指针变量x,y就可以使用啦~ 也就是指针必须要初始化。 #include<iostream> #include<cmath> #include<cstdio> #include<algorithm>

指针数组和数组指针

ⅰ亾dé卋堺 提交于 2020-02-09 18:17:43
先写一个 数组指针 int arr [ 3 ] [ 5 ] ; //这是一个普通的二维数组 int ( * p ) [ 5 ] ; //这是一个指向数组的指针 下标优先级高于间接访问,但是由于括号的存在,首先执行的还是间接访问。所以,p 是个指针,一个指向整型数组的指针。在声明中加初始化就是下面这个样子: int ( * p ) [ 5 ] = arr ; 换句话说,这里的指针表示二维数组的行 下面说一下 指针数组 // 举个例子,现在我有以下元素需要存在数组里 // do while return register // 当然我可以写一个二维数组: char arr [ 4 ] [ 9 ] = { "do" , "while" , "return" , "register" } ; // 也可以用一个指针数组这样表示: char * api [ 4 ] = { "do" , "while" , "return" , "register" } ; 显然,这里的指针表示的是二维数组的列 总结一下:数组指针只有一个指针,而指针数组可以有多个指针;数组指针里边的指针表示的是数组的行,而指针数组里面的指针表示的是二维数组的列;都表示二维数组。 来源: CSDN 作者: 楚渐灵 链接: https://blog.csdn.net/qq_43747991/article/details

VS如何反汇编

痞子三分冷 提交于 2020-02-09 02:39:20
1. 打开反汇编窗口:调试模式下,按Ctrl+F11。 2. 术语:   2.1 ESP(Extended Stack Pointer): 堆栈指针,寄存器存放当前线程的栈顶指针;  i.e: move ebp, esp -- 用ebp保存当前栈指针;   2.2 EBP(Extended Base Pointer): 基址指针,寄存器存放当前线程的栈底指针;  i.e: push ebp -- 将基址指针压入栈;   2.3 EIP:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完成当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行;   2.4 EAX: 累加器(Accumulator),加法乘法指令的缺省寄存器;   2.5 EBX: 基地址(Base)寄存器,在内存寻址时存放基地址;   2.6 ECX:计数器(Counter),是重复(REP)前缀指令和LOOP指令的内定计数器;   2.7 EDX:存放整数除法产生的余数;   2.8 ESI/EDI: 源/目标索引寄存器(Source/Destination Index), 在很多字符串操作指令中,DS:ESI指向源串,而ES:EDI指向目标串。 上面从网上找来的。 也可以这样 或者 来源: https://www.cnblogs.com/hsuppr/p/7762322.html

什么是链表?

浪尽此生 提交于 2020-02-09 01:44:22
在了解完 什么是数据结构 之后,让我们一起来探索下数据结构中常见的一种— 链表 。 链表 链表是数据结构之一, 其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间。 如上图所示就是链表的概念图,Blue、Yellow、Red 这 3 个字符串作为数据被存储于链表中,也就是 数据域 ,每个数据都有 1 个指针,即 指针域 ,它指向下一个数据的内存地址,其中 Red 是最后 1 个数据,Red 的指针不指向任何位置,也就是为 NULL,指向 NULL 的指针通常被称为空指针。 在链表中,数据一般都是分散存储于内存中的,无须存储在连续空间内。 因为数据都是分散存储的,所以如果想要访问数据,只能从第 1 个数据开始,顺着指针的指向一一往下访问(这便是 顺序访问 )。比如,想要找到 Red 这一数据,就得从 Blue 开始访问,这之后,还要经过 Yellow,我们才能找到 Red。 如果想要添加数据,只需要改变添加位置前后的指针指向就可以,非常简单。比如,在 Blue 和 Yellow 之间添加 Green。 首先将 Blue 的指针指向的位置变成 Green,然后再把 Green 的指针指向 Yellow,数据的添加就大功告成了。 数据的删除也一样,只要改变指针的指向就可以,比如删除 Yellow。 这时,只需要把 Green 指针指向的位置从 Yellow

变量的地址和指针

最后都变了- 提交于 2020-02-09 01:43:15
一、变量的地址和指针 计算机中有一个硬件叫做内存条,当我提起这个硬件的时候往往都会说多大的。1G、2G、4G…这都是在说它的空间小,计算机中的内存都是以字节为单位的一片连续的内存空间,每一个字节都有一个编号,这个编号就称为内存地址,如同旅馆的房间一样,单人间、双人间等等,每个房间都有自己的编号。 内存中的空间是连续的,地址号也是连续的,并且都是用二进制来表示的。 变量在定义的时候先要说明定义的类型,如int k,double b,char ch等等如此的定义。这样是在和电脑系统打招呼,我们是俩人要一个两人间,目的就是告诉老板你的房间要的是两个人的空间。不能有定的是两人间,结果来了三个人住;同时也不能定的是两人间,结果就你自己来了(对自己多花钱了)。 综上所诉: 变量的定义就是给变量开辟存储空间的过程 int a float b a a b b b b 1012 1013 1014 1015 1016 1017 这就是变量定义的时候系统给随机开辟的地址空间,再结合我们在一开始讲的不同类型的变量大小,其实就是在说变量所占的内存单元的多少。 1012就是整型变量a的首地址,1014就是浮点类型b的首地址。 当要用一个变量时,系统就会迅速的找出处这个变量,所以在C程序中还有一个这样的变量存在,就是 指针 指针就是用来存放一个变量在内存中的地址,当要调用这个变量的时候就能迅速找到,

归并排序

醉酒当歌 提交于 2020-02-08 23:20:19
基本思想 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾 将另一序列剩下的所有元素直接复制到合并序列尾 C++代码 # include <iostream> using namespace std ; void merge ( int arr [ ] , int l , int r , int m ) { int help [ r - l + 1 ] ; int i = 0 ; int p1 = l ; int p2 = m + 1 ; while ( p1 <= m && p2 <= r ) { help [ i ++ ] = arr [ p1 ] < arr [ p2 ] ? arr [ p1 ++ ] : arr [ p2 ++ ] ; } while ( p1 <= m ) { help [ i ++ ] = arr [ p1 ++ ] ; } while ( p2 <= r ) { help [ i ++ ] = arr [ p2 ++ ] ; } for ( i = 0 ; i < r - l + 1 ; i ++ ) { arr

【JVM虚拟机】(9)-- JVM是如何处理异常的

試著忘記壹切 提交于 2020-02-08 23:07:20
JVM是如何处理异常的 上篇博客我们简单说过 异常信息是存放在属性表集合中的Code属性表里 ,那么这篇博客就单独讲Code属性表中的exception_table。 在讲之前我们先思考两个问题? 1、为什么捕获异常会较大的性能消耗? 2、为什么finally中的代码会永远执行? 接下来会从JVM虚拟机的角度来解答这两个问题。 一、概念 1、JVM是如何捕获异常的? 1、编译而成的字节码中,每个方法都附带一个 异常表 。 2、异常表中每一个条目代表一个 异常处理器 3、触发异常时,JVM会遍历异常表,比较触发异常的字节码的索引值是否在异常处理器的 from指针到to指针 的范围内。 4、范围匹配后,会去比较 异常类型和异常处理器中的type是否相同 。 5、类型匹配后,会跳转到 target指针所指向的字节码 (catch代码块的开始位置) 6、如果没有匹配到异常处理器,会弹出当前方法对应的 Java栈帧 ,并对调用者重复上述操作。 2、什么是异常表? 1. 每个方法都附带一个异常表 2. 异常表中每一个条目, 就是一个异常处理器 异常表如下: 3、什么是异常处理器?其组成部分有哪些? 1、异常处理器由from指针、to指针、target指针,以及所捕获的异常类型所构成(type)。 2、这些指针的数值就是字节码的索引(bytecode index, bci),可以直接去定位字节码

C++11 std::function、std::bind和lambda表达式

微笑、不失礼 提交于 2020-02-08 23:06:50
  参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html   一、关于std::function与std::bind   翻看了几篇博客,还不如看书逻辑性好。以下内容摘自祁宇《深入应用C++11: 代码优化与工程级应用》一书。   有以下4种情况可被称为可调用对象。   1、是一个函数指针。(这里的函数要求是如C函数一样的编译期内存确定的函数指针)   2、是一个具有operator()成员函数的类对象。(让类重载调用操作符operator(),关键在于是以类对象调用形式调用)   3、是一个可被转换为函数指针的类对象。(这一点与2是一样的,函数可以使用函数名+operator的形式调用,也可以使用函数指针如 void(*p)(int); p = test;     (*p) (n); 注意看下面例子中的这一种情况)   4、是一个类成员(函数)指针。   例子:   void func( void) { // ... }   struct Foo {     void operator()( void) { // ... }    };   struct Bar {     using fr_ t = void(*)( void); //void (*)(void

9、指针

空扰寡人 提交于 2020-02-08 19:42:18
指针 指针类型用于表示内存地址,本质上是一个整数。对于指针类型的变量,可以使用星号操作,对指定的内存地址进行读写。 内存地址的表示 变量和内存是对应的,每个变量都对应于若干字节的内存。当读取一个变量的值时,其实就是读取内存的值。当修改一个变量的时候,其实就是修改了内存的值。 例如,下面的定义的变量 a 在内存对应4个字节。 unsigned int a = 0xA0A0A0A0; // a 内存中的值:A0 A0 A0 A0 a = 0xB1B1B1B1; // a 内存中的值:B1 B1 B1 B1 把变量所对应的内存的地址,简称为变量的地址。变量的地址是一个整数,可以用操作符 & 来取得。例如: int a = 0; double b = 0; printf("%08x\n",a); // 把地址按十六进制打印 printf("%08x\n",b); // 把地址按十六进制打印 指针的概念 带星号的类型,称为指针类型。这种类型定义的变量,称为指针类型的变量,简称指针变量,或称为指针,例如: #include<stdio.h> int main() { int a = 10; int b = 11; int* p = &a; // p 指向变量 a 的地址 p = &b; // 修改 p 的值,现在指向了变量 b 的地址 return 0; } 星号操作 在引入指针之后

每日一题--盛水最多的容器

巧了我就是萌 提交于 2020-02-08 18:52:44
这道题的暴力方法就是遍历所有两个木棍的组合,然后记录最大值。 而想要提升解题速度,可以采用双指针的方法,分别在两端向中心靠拢,根据木桶原则,每次由最短边向长边前进,记录最大盛水量: class Solution: def maxArea(self, height: List[int]) -> int: l = 0 r = len(height) - 1 max_area = (r - l) * min(height[l], height[r]) while(l < r): max_area = max(max_area, (r - l) * min(height[l], height[r])) if height[l] < height[r]: l+=1 else: r-=1 return max_area 在开始解题时我虽然已经考虑到了双指针方法,但是是对于如何前进指针比较模糊,现在回头看感觉自己当时真够笨的。 来源: CSDN 作者: Angel__c 链接: https://blog.csdn.net/Angel__c/article/details/104224882