指针

浅谈C++中指针和引用的区别

╄→尐↘猪︶ㄣ 提交于 2020-01-11 06:46:00
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。 而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。 (2)可以有const指针,但是没有const引用; (3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。 (6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小; (7)指针和引用的自增(++)运算意义不一样; 2.指针和引用作为函数参数进行传递时的区别。 (1)指针作为参数进行传递: 复制代码 #include<iostream>

Record19—const做函数参数

安稳与你 提交于 2020-01-11 06:19:48
目录 Const的五种使用情况 Const的使用本质 总体代码 Const的五种使用情况 const在C与C++中是不同的, 先看两种写法: const int a; int const b; 这两种写法都是对的,也是一样的,代表一个整型变量不能被修改。 再看: const char *c; char * const d; 这两种写法也是对的,但代表的意义是不一样的。其中,c是一个 指向常整形数的指针 (所指向的内存数据不能被修改,但是本身可以修改);d 是 一个常指针 (指针变量不能被修改,但是它所指向内存空间可以被修改)等同于定义一个"char buf[100]" 总结:先要明白指针变量和它所指向的内存空间变量,是两个不同的概念,那么看const的时候,就看是针对的是指针变量还是针对的是指针变量指代的内存空间。 看const 是放在*的左边还是右边 看const是修饰指针变量,还是修饰所指向的内存空变量 还有最后一个用法: const char * const e ; 这么写,意味着e是一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) 下面举例说明: void getmeml201(const char *p) { p = 1; p = 3; //指针指向的内存空间不能被修改 p[1] = 'a'; //报错 return; } 这段代码和上面的变量d是一种情况

指针数组和数组指针的区别

蹲街弑〆低调 提交于 2020-01-11 05:02:00
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

惊艳的时间轮定时器

北城余情 提交于 2020-01-11 03:42:30
问题引入:游戏里面每个Player身上有很多buffs,在每一个tick(最小时间段)都要去检查buff里面的每一个buff是不是过期,产生的效果如何,造成在每个tick里面都去遍历一个长list,明显很不好。 怎么优化? 1.原始模型: buff的状态在每一个tick里面都要更新!可以想象指针每移动一下,都会非常沉重地拖着所有的BuffList,好可怕…… 2. 优化模型1: 我们要避免的是:原始模型在每一个tick里面都要遍历List,那么我们试下以Times为key,在加入buff里时分配好它的结束和启作用的时间属于哪一个Time, 这个模型要注意的问题:当要加的Buff起效果已超过了一轮Tick总数时! 比如时间轮总Tick数为12个,现在指针到了tick=2处,要加一个再经过tick为15(起效果)的buff,怎么办? 可以算得:2 + 15%12 = 5,把此buff放到tick=5的槽里面(每个buff都会记录下它的结束时间的),待tick从2跳一轮回到2再跳3下到tick=5,这个buff就会执行。 这个模型完美解决原始模型(每个Tick都遍历整个BuffList)的问题,似乎很完美哦,但是却引入了新的问题,我们的最小tick明显不可能以小时计算,如果我们把Tick划分到秒级别, 一轮就有12*3600 = 43200个key,

2019春第六周作业

拥有回忆 提交于 2020-01-11 03:02:03
这个作业属于哪个课程 C语言程序设计Ⅱ 这个作业要求在哪里 2019春第六周作业 我在这个课程的目标是 充分理解指针与数组在函数中的调用过程 这个作业在哪个具体方面帮助我实现目标 锻炼我的思维 参考文献 C语言程序设计(第三版) 基础题 1.求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 1)实验代码 #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; } double fun(double *a,double *b) { double sun; sun=sqrt(*a)+sqrt(*b); return sun; } 2)设计思路 3)本题调试过程中碰到问题及解决办法 问题:没看清题目要求,忘记返回计算的值。 解决办法

2.4.3 顶层const

末鹿安然 提交于 2020-01-11 00:10:05
顶层const 如前所述,指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及指针所指的对象是不是一个常量就是两个相互独立的问题。用名词 顶层const (top-level const)表示指针本身是个常量,而用名词 底层const (low-level const)表示指针所指的对象是一个常量。 更一般地,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算数类型、类、指针等 。底层const则与指针和引用等复合类型的基本类型部分有关。比较特殊的是,指针类型既可以是顶层const也可以是底层const,这一点和其他类型相比区别明显: int i = 0; int *const p1 = &i; // p1是一个指向int型对象的常量指针,不能改变p1的值,这是一个顶层const const int ci = 42; // 不能改变ci的值,这是一个顶层const const int *p2 = &ci; // 允许改变p2的值,这是一个底层const,p2是一个指向整型常量的指针 const int *const p3 = p2; // p3是一个指向整型常量对象的常量指针,靠右边的const是顶层const,靠左边的const是底层const const int &r = ci; // 用于声明引用的const都是底层const

go指针

我的梦境 提交于 2020-01-10 22:05:51
1. 指针类型 package main import ( "fmt" ) // 演示golang中指针类型 func main() { // 基本数据类型在内存布局 var i int = 10 // i 的地址是什么,&i // & 地址符 fmt.Println("i的地址=", &i) // i的地址= 0xc000062080 // 下面的 var ptr *int = &i // 1. ptr 是一个指针变量 // 2. ptr 的类型 *int // 3. ptr 本身的值&i var ptr *int = &i fmt.Printf("ptr=%v\n", ptr) // ptr=0xc000062080 // ptr存的地址,但是ptr也有自己的地址 fmt.Printf("ptr 的地址=%v\n", &ptr) // ptr 的地址=0xc00008e020ptr 指向的值=10 fmt.Printf("ptr 指向的值=%v", *ptr) // ptr 指向的值=10 // *ptr取的是存的地址所指向的值 }  案例 package main import "fmt" func main() { var num int = 9 fmt.Printf("num address=%v\n", &num) var ptr *int ptr = &num

1161: 字符串长度(指针专题)

别来无恙 提交于 2020-01-10 19:53:36
题目描述 编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。 int len(char *sp) { //实现sp所指串的长度,不计空格。 } 输入 输入一个字符串,以回车结束,长度不超过100。 输出 输出一个整数,单独占一行。 样例输入 What day is today? 样例输出 15 # include <stdio.h> int len ( char * sp ) ; int main ( ) { char s [ 81 ] ; char * p = s ; gets ( p ) ; int y ; y = len ( p ) ; printf ( "%d" , y ) ; return 0 ; } int len ( char * sp ) { int i = 0 , n = 0 ; while ( sp [ i ] != '\0' ) { if ( sp [ i ] != ' ' ) { n ++ ; } i ++ ; } return n ; } 来源: CSDN 作者: Dvv啊 链接: https://blog.csdn.net/weixin_46091417/article/details/103927947

typedef和#define的用法与区别

放肆的年华 提交于 2020-01-10 18:21:32
转:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html typedef和#define的用法与区别 一、typedef的用法 在C/C++ 语言 中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以 增强 程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以 发现 潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与

单例模式简析

蓝咒 提交于 2020-01-10 17:20:39
11.单例模式案例----主席 (1)内部维护一个私有化static的对象指针。(类外初始化,编译阶段就new出来了,比main函数的执行出现的早) (2)默认构造和拷贝构造私有化 (3)对外提供公有化static getInstance()方法访问这个指针 注意:目的:为了让类中中有一个实例,实例不需要自己释放(即不需要自己提供析构函数) 案例一主席 # include <iostream> # include <string> using namespace std ; class ChairMan { public : static ChairMan * getInstance ( ) { return singleMan ; } private : static ChairMan * singleMan ; //私有静态唯一对象指针 ChairMan ( ) { cout << "ChairMain 构造函数的调用" << endl ; } ChairMan ( const ChairMan * & C ) { } } ; ChairMan * ChairMan :: singleMan = new ChairMan ; //static类外初始化 void test01 ( ) { cout << "main函数的调用" << endl ; /