指针

指针和引用的区别

倖福魔咒の 提交于 2020-01-14 06:28:39
从概念上讲: 指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数

指针和引用的区别

北慕城南 提交于 2020-01-14 06:27:12
引自 http://www.cnblogs.com/jiu0821/p/4127382.html 1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名。 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

指针与引用的区别

十年热恋 提交于 2020-01-14 06:24:59
* 指针是一个变量有单独的存储空间(引用是一个对象的别名,没有单独的存储空间,使用的是原对象) * 指针初四化后可以改变,可以用来指向其他的对象(引用初始化后不能改变,不能用来引用其他的对象) * 指针可以为空(引用不能为空) * 指针的长度为4个字节(引用的长度位引用对象的长度) 来源: https://www.cnblogs.com/smallredness/p/11063621.html

指针和引用的区别

微笑、不失礼 提交于 2020-01-14 06:23:03
1、指针是存放变量地址的一个变量,指向内存的一个存储单元,在逻辑上是独立的,可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 引用是其所引用的变量的一个别名,与其所引用的变量实质上是同一个东西,在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。 2、指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的);3 3、指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; 4、指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了; 5、"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小; 6、指针和引用的自增(++)运算意义不一样; 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

快速排序

℡╲_俬逩灬. 提交于 2020-01-14 04:50:02
快速排序的主要思想是partition思想,其大致内容如下: 1.随机选择基准值,一般是第一个数; 2.利用头尾指针,头指针负责找第一个比基准值大的数,尾指针负责找第一个比基准值小的数,交换两个指针的内容; 3.将基准值放到其应该属于的位置; 4.递归地进行以基准值分成的左右部分; c++代码 //快速排序 void quick_sort ( int arr [ ] , int start , int end ) { if ( start < end ) { //partition过程 //基准值 int key = arr [ start ] ; //前后扫描用的指针 int left = start ; int right = end ; while ( left < right ) { //right从右向左负责找第一个比基准值小的值 while ( left < right && arr [ right ] >= key ) { -- right ; } if ( left < right ) arr [ left ++ ] = arr [ right ] ; //left从左向右负责找第一个比基准值大的值 while ( left < right && arr [ left ] < key ) { ++ left ; } if ( left < right ) arr [

C语言指针小应用

早过忘川 提交于 2020-01-14 02:44:45
C语言指针小应用:如何用指针实现多个变量值的交换? 方法一:不交换变量的值,交换两个指针变量的值。 # include "stdafx.h" int main ( int argc , char * argv [ ] ) { int a , b ; //定义两个整形变量 int * pointer_1 , * pointer_2 ; //定义两个指针变量 pointer_1 = & a ; pointer_2 = & b ; //将a和b的地址赋个指针变量 printf ( "please input the values of a and b.\n" ) ; scanf ( "%d%d" , & a , & b ) ; if ( a < b ) { pointer_2 = & a ; pointer_1 = & b ; } //a<b,则交换指针所指向的地址 printf ( "max=%d min=%d\n" , * pointer_1 , * pointer_2 ) ; return 0 ; } 方法二:交换指针变量所指变量的值 # include "stdafx.h" void swap ( int * x , int * y ) ; int main ( int argc , char * argv [ ] ) { int a , b ; int * pointer_1

指针学习

独自空忆成欢 提交于 2020-01-14 02:19:42
程序中定义的变量,在编译时,系统会给这个变量分配内存单元,根据数据类型,分配一定的长度空间。如Visual C++为整型变量分配4个字节,float分配4个字节,对char分配1个字节,内存区的每个字节有一个编号,这就是“地址”。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象的称为”指针”,即一个变量的地址称为该变量的” 指针 ” 。 指针变量 ,也是地址变量; 如: int i=3; / 定义整型变量并初始化 int *i_pointer; / 定义整型数据的指针变量 i_pointer=&i; / 将i 的地址存放到i_pointer中,比如变量i 所占用单元的起始地址为2000,那么i_pointer=2000 。 *i_pointer=3; 其中*i_pointer 表示指向的对象,指向就是通过地址来实现的。通过i_pointer=2000的地址指向该变量单元,即 i 的值为3.。 例中变量i 的指针为2000(地址),指针变量i_pointer 只是存放地址的变量,不能说i的指针变量是2000。 定义指针变量: 类型名 *指针变量名; 如:int *pointer_1; 对它 初始化 还可以写成int *pointer_1=&a ; 上面定义的指针变量前面的" * " 表示该变量的类型为指针类型,在定义指针变量时 必须指定基类型

支持内部晋升的无锁并发优先级线程池

蓝咒 提交于 2020-01-14 02:12:41
支持内部晋升的无锁并发优先级线程池 文章目录 支持内部晋升的无锁并发优先级线程池 引言 推导过程 如何实现优先级晋升 数据结构设计 一个指针产生的问题 任务插入指针和任务读取指针 任务插入指针如何移动 任务插入指针移动到同一位置导致的优先级任务混合问题 任务读取指针如何移动 插入和读取并发 代码实现 任务插入 任务的读取 包装为BlockQueue 效果展现 代码托管地址 引言 在技术群讨论到一个有意思的业务需求,可以描述为: 有一个内部按照优先级进行任务排序的线程池。线程池会优先执行高优先级的任务。随着时间的流逝,线程池内部低优先级的任务的优先级会逐渐晋升变为高优先级,以避免被不断新增的高优先级任务阻塞导致饿死。 考虑到 JDK 已经为开发者提供了自定义线程池 ThreadPoolExecutor 以及优先级队列 PriorityBlockingQueue ,两者相结合并且定期调整队列中低优先级任务的优先级再进行 resort 将低优先级的任务调整到队列的前头,也可以一定程度上避免被饿死。 这种方案的问题在于 resort 的消耗比较高,并且还需要重新计算每一个任务的优先级。为此,引出我们下面的设计,希望使用无锁并发的数据结构存储任务,并且任务支持自动的优先级晋升,保证低优先级的任务最终能够执行而不会被不断增加的高优先级任务饿死。 欢迎加入技术交流群186233599讨论交流

三数之和求解,用双指针方式-------java实现

大城市里の小女人 提交于 2020-01-14 02:09:52
三数之和的求解 采用双指针,对其进行从两边往中间遍历的方式,找到sum==0的数组下标,并输出。 题目要求: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 以下为代码实现部分 public class Main3 { //三数之和进行求解 public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); for(int k = 0; k < nums.length - 2; k++) { if (nums[k] > 0) break; if (k > 0 && nums[k] == nums[k - 1]) continue; int i = k + 1, j = nums.length - 1; while (i < j) { int sum = nums[k] + nums[i] + nums[j]; if

第六周作业

别说谁变了你拦得住时间么 提交于 2020-01-14 01:53:41
这个作业属于那个课程 c语言程序设计 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889 我在这个课程的目标是 初步了解指针 这个作业在那个具体方面帮助我实现目标 指针的使用 参考文献 课本C语言程序设计 6-1 求两数平方根之和 (10 分) 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 (1)实验代码 #include<stdio.h>