"指针"和"引用"大对比】的更多相关文章

相同点: 都能够直接引用对象,并对对象进行操作. 不同点: 指针 引用 指针类型的变量能够保存一个对象的地址 引用是一个对象的别名 可以为空nil,可以不初始化 不可以为空nil,必须初始化 当设计一个变量用于指向另一个对象,但是变量有可能为空,这时应该使用指针. 当设计一个变量总是指向一个对象,不允许为空,这时应该使用引用. 声明指针可以不指向任何对象,因此使用指针之前,要做判空操作 不用做判空操作,因为它一定不为空!=nil 可以改变指向,从而指向其他对象 引用不可改变指向,它对一个对象"致…
指针和引用在形式上比较好区分,由于有很多相似的功能,因此在使用上容易混淆.因此有必要对指针和引用进行对比,以便于在使用时使程序正确高效. 1.引用不可以为空,而指针可以为空. 我们知道引用是对象的别名,因此他不可以为空,因为引用的对象都不存在,怎么可能会有别名.因此在使用时必须对引用进行初始化.而指针可以指向任何对象,也可以不初始化. 2.使用指针之前要判空,而引用不必. 由于指针可以指向任何对象,也可以不指向任何对象,因此在使用前必须先进行判空.而引用则不必,因为引用是对象的别名,在进行引用的…
花下猫语:本文是学习群内 樱雨楼 小姐姐的投稿.之前已发布过她的一篇作品<当谈论迭代器时,我谈些什么?>,大受好评.本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念.祝大家读有所获,学有所成! 樱雨楼 | 原创作者 豌豆花下猫 | 编辑润色 本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/k0VNL6uyvBHT7PWdzEPROQ 0 引言 指针(Pointer)是 C.C++ 以及 Ja…
  http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变:…
 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针…
1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写高效地利用系统资源的程序,理解指针和引用时必不可少的一步. 在编程语言中,变量使你能够处理内存中的数据. C++让你能够动态地分配内存(new和delete),以优化应用程序对内存的使用. 不同于C#和Java等基于运行时环境的新语言,C++没有自动垃圾收集器对程序已分配但不能使用的内存进行清理.所…
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递. 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作 引用传递: 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈 中开辟了内存空间,但是这时存放的是由主调函数放进来的实参…
指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其他的存储单元 (4) 指针可以有多级 (5) 指针使用时需要解引用 (6) sizeof指针得到的是指针本身大小(所指向的变量或对象的地址) (7) 指针的自增是地址的改变而不是指针所指向变量的改变 (8) 程序为指针变量分配内存区域 2. 引用 (1) 引用是原变量的一个别名,跟原来的变量实质是同…
以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;    //p类型为 char*, *p类型为char. 也可以写成char *p = &a; 类型char[100]和char (*)[100]可隐式到char*转化,指向第一个元素的地址.不包含隐式转换的写法应该:char *p  = &a[0];   而它们的区别: 再看 #include &l…
指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.       ★ 相同点:       1. 都是地址的概念:        指针指向一块内存,它的内容是所指内存的地址:        引用是某块内存的别名.       ★ 区别:       1. 指针是一个实体,而引用仅是个别名:     2. 引用使用…
二维vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二维vector 动态创建m*n的二维vector方法一:vector<vector <int> > ivec;ivec.resize(m);for(int i=0;i<m;i++) ivec[i].resize(n); 方法二:vector<vector <int> > ivec;ivec…
在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在<Effective c++>一书中页介绍了关于指针和引用的区别.     值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值.函数的传值有两种,一个是值传递:一个地指针传递. 一.引用简介     引用就是某一变量(目标)的一个别名,对引用的操作与对变量直…
说道C++的指针,很多人都很头疼,也很confuse.经常把它和变量名,引用(reference)等混淆,其实这最主要的原因是很多程序员对于基本知识的掌握有问题,从而导致的很多基本概念的混淆.本文就是从最基本的概念讲起,着重分析和比较指针和引用.主要从以下几个方面着重的讲解: 1. 变量(variable)的表现形式: 2. 指针的结构和原理: 3. 引用的结构和原理: 4. 指针在Array中的应用和注意事项: 5. 指针不能dereference的几种情况: 一:变量的形式 说道变量,很多人…
引言:  在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以.  那为什么?让我们来解开这神秘的暗纱! 1. 类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量. 如果该类中存在虚函数的话,再多加一个指向虚函数列表指针—vptr. 例如声明如下两个类,并分别实例化两个对象,它们的内存分配大致如下:(vptr具体在什么位置,与编译器有关,大多数都在开始处) class base { public: virtual ~base() {}; virtual stri…
题目 写一个树的插入和遍历的算法,插入时按照单词的字典顺序排序(左边放比它"小"的单词,右边放比它"大"的单词),对重复插入的单词进行计数. 程序源码 #include <iostream> #include <cstring> #include <sstream> //vs2010中不加入这句话不能使用cin和cout,用gcc编译不用加 using namespace std; struct Tnode { string wo…
大家都知道java和C#中没有指针这个概念.但是也导致了编程中常常忽略了对象与引用的区别,难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址是不可能的,关键是java中如何避免了指针这个概念. java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的.通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的.…
4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. 1.2 void *malloc(int size); 说明:…
引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径. 但是它们的差别还是挺大的: 先从它们的值说起,一个有效的指针值通常具有三种面孔,一是保存一个特定对象的地址,而且一般是用取地址符号“&”把该特定对象的地址拿出来赋 给指针:二是0值,此时表明它不指向任何对象,尽管任一个int型变量的值可能为0,但是直接把int型变量赋给指针是非法的,不过,如果是在编译时可以 获得0值的const变量则指针对它网…
转自http://www.cnblogs.com/tangxiaobo199181/ 作者:算法生活 微信公众号:算法生活 出处:http://www.cnblogs.com/tangxiaobo199181/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. C++ 指针和引用 吐血整理 Pointer&Reference 说道C++的指针,很多人都很头疼,也很confuse.经常把它和变量名,引用(reference…
自己看书时的一些理解,可能有错误的地方.随着指针的使用增多,会不断修改这篇文章的内容,过去错误的会用划线划去后保留. 1.对引用.指针.常量引用.指向常量的指针.常量指针的理解 //对引用.指针.常量引用.指向常量的指针.常量指针的理解 int main() { //引用 int a = 1; int &r_a = a;//只要是引用都必须初始化 r_a = 5;//引用不是一个对象,但可以通过改变引用来间接改变引用对象的值 std::cout << "引用 " &…
先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的函数体.当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁.因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了. 第二种情况:返回函数内部用new初始化的指针的引用 inline const rational& operator*(const…
一.基本知识 指针和引用的声明方式: 声明指针: char* pc; 声明引用: char c = 'A'                   char& rc = c; 它们的区别: ①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声…
C++之值传递&指针传递&引用传递详解 目录 C++之值传递&指针传递&引用传递详解 1.函数基础 2.值传递 3.指针传递 4.引用传递 1.函数基础 一个函数由以下四部分组成: 返回类型 函数名 参数(0个或多个) 函数体 其中,函数的参数叫做形参,函数执行的操作的语句块叫做函数体 2.值传递 像一个这样swap函数,调用的时候,会用实参初始化swap函数对应的形参 void Swap(int a, int b) { int tmp = a; a = b; b = tm…
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看看行不行,结果给了我当头一棒,解递归失败! 最后我分析了一下原因: 首先看一下,原来递归的实现方式 typedef struct _TreeNode { struct _TreeNode *leftNode; struct _TreeNode *rightNode; TypeData data; }…
粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /*未释放内存前 -> p1 Address : 0012FDDC p1 value : 003429B8, 在这里,p1它也是一个变量,既然是一个变量, 那么它将会以值的传递,把外部变量p1传到栈内,在栈内产生一个地址:0012FDDC, 当然,它的值不会变仍然是指向堆地址:003429B8 .*/ de…
C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.…
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效的机制,同时引入了另一个与指针相似但不相同的机制: 引用. 一.引用 简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量. 定义一个引用的语法如下所示: 变量类型   &引用标识符 = 变量名. Exp: ; int &iRef = iVar; iRef = ;…
本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #include<iostream>using namespace std;void foo(int*p);int main(){    int a=5;    int *b=&a;    printf("%d %d\n",b,*b);    foo(b);    printf…
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: ; void func(int *p) { p = &m_value; } int main(int arg…
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Screen类的定义 //etc... }; 1 2 3 当用实例化一个类的对象时,编译器会根据类的定义来分配相应的存储空间.也就是说,在创建对象前,一定要有完整的类定义,这样编译器才能正确的计算所需空间. 那么我们来看如下代码: class Screen{ Screen sc; //error, 'sc'…