精华内容
下载资源
问答
  • C++ 指针引用和指向引用指针

    万次阅读 多人点赞 2019-02-06 18:31:49
    使用指针的一个简单例子就是: int v = 1; int *p = &v; 需要预先强调的是没有指向引用指针!因为引用不是对象,没有地址。但是指向引用指针是什么形式呢? 是对一个引用进行如下取地址吗: int v = 1; ...

    指向引用的指针

    使用指针的一个简单例子就是:

    int v = 1;
    int *p = &v;
    

    需要预先强调的是没有指向引用的指针!因为引用不是对象没有地址。但是指向引用的指针是什么形式呢?
    是对一个引用进行如下取地址吗:

    int v = 1;
    int &ri = v;	// 整型变量v的引用
    int *p = &ri;	// 这是指向引用的指针吗?
    

    事实上不是,这是一个普通的整型指针,虽然我们说引用没有地址,但是对引用ri的操作实际上是对v的操作。这是是定义了一个整型指针,并且让它指向了v
    那如何定义一个指向引用的指针呢(虽然是不合理的请求)?当我们定义指针的时候,我们用到了*,那么当我们定义指向引用的指针时,免不了要用到*&

    int v = 1;
    int &ri = v;
    // int &*p = &ri;
    

    由于引用并不存在地址,因此第三行将会报错。我们可以从右往左读,*表明p是一个指针,余下的&说明了p指向类型的类型。

    指针的引用

    之前说到指向引用的指针,现在来说指针的引用就容易多了。

    int v = 1;
    int *p = &v;'
    int *&rp = p;
    

    &说明r是一个引用。*确定r引用的类型是一个指针。

    其他

    因为引用不是对象,故无引用的数组,无指向引用的指针,无到引用的引用:

    int& a[3]; // 错误
    int&* p;   // 错误
    int& &r;   // 错误
    

    [1] 引用声明
    [2] 指向指针的引用

    展开全文
  • C++ 引用以及引用指针的区别

    千次阅读 2018-12-09 21:54:58
    前面整理了指针的用法,但是经常和指针拿来对比东西是引用。确实指针在使用的过程中会有很多的麻烦,比如赋初值、使用时判空、无效指针、深浅拷贝等等。在我看来引用指针的高级替代,它的使用规则规避了很多出错的...

    概述

    前面整理了指针的用法,但是经常和指针拿来对比东西是引用。确实指针在使用的过程中会有很多的麻烦,比如赋初值、使用时判空、无效指针、深浅拷贝等等。在我看来引用的指针的高级替代,它的使用规则规避了很多出错的可能。下面就对引用进行整理。

    需要注意的是C11引入了右值引用,我们这里所说的引用都是在讨论左值引用

    1、什么是引用?

    引用是给对象起了一个别名,它也是一种复合类型。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

    定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因此引用必须初始化,而且引用不能重新绑定到另一个对象,类型要和绑定的类型一致

    引用本身不是独立的数据类型,所以不占用空间,引用的地址就是对象的地址。也就无法定义指向引用的指针,无法声明存储引用类型的数组等。

    int ivalue = 97;
    int ivalue2 = 98;
    
    int& refvalue = ivalue;		//refvalue是给ivalue起的的别名
    refvalue = ivalue2;		//没有重新绑定,这里是赋值操作
    
    int& refvalue2;			//编译出错,没有进行初始化 
         
    int& refvalue4 = 10;		//只能绑定到对象上
    int&* p = &refvalue;		//不能定义指向引用的指针
    
    int& arr[5] = {1,2,3,4,5};	//不能定义引用数组    
    int&& refvalue5 = refvalue;	//不能定义引用 引用的引用    
    double& refvalue3 = ivalue;	//编译出错,类型不一致
    

    2、引用的使用

    引用跟指针很相似,使用也差不多,这里就介绍一些其中差别有点大的地方,至于细节可以去看前面整理的指针内容,只要将*改成&使用就行。

    2.1、引用作为函数参数

    1.当用引用作为函数的参数时,其效果和用指针作为函数参数的效果相当。当调用函数时,函数中的形参就会被当成实参变量或对象的一个别名来使用,也就是说此时函数中对形参的各种操作实际上是对实参本身进行操作,而非简单的将实参变量或对象的值拷贝给形参。

    2.通常函数调用时,系统采用值传递的方式将实参变量的值传递给函数的形参变量。此时,系统会在内存中开辟空间用来存储形参变量,并将实参变量的值拷贝给形参变量,也就是说形参变量只是实参变量的副本而已;并且如果函数传递的是类的对象,系统还会调用类中的拷贝构造函数来构造形参对象。而使用引用作为函数的形参时,由于此时形参只是要传递给函数的实参变量或对象的别名而非副本,故系统不会耗费时间来在内存中开辟空间来存储形参。因此如果参数传递的数据较大时,建议使用引用作为函数的形参,这样会提高函数的时间效率,并节省内存空间

    3.使用指针作为函数的形参虽然达到的效果和使用引用一样,但当调用函数时仍需要为形参指针变量在内存中分配空间,而引用则不需要这样,故在C++中推荐使用引用而非指针作为函数的参数。

    4.如果在编程过程中既希望通过让引用作为函数的参数来提高函数的编程效率,又希望保护传递的参数使其在函数中不被改变,则此时应当使用对常量的引用作为函数的参数。

    5.数组的引用作为函数的参数:C++的数组类型是带有长度信息的,引用传递时如果指明的是数组则必须指定数组的长度

    void func(int(&a)[5])//数组引用作为函数的参数,必须指明数组的长度 
    {
    	sizoef(a);		//这里是20
    	for(auto& i : a)
    		i++;
    }
    
    int main()
    {
        int number[5]={0,1,2,3,4};
        func(number); 
        return 0; 
     }
    

    2.2、和const的使用

    因为引用的定义就不能对它重新绑定,所以只有能不能通过引用修改其绑定的变量或对象。

    int a=10;
    const int &new_a=a;
    new_a=11;		//错误!不允许通过常引用对其所绑定的变量或对象进行修改 
    

    特别注意:

    #include<iostream>
    #include<string> 
    using namespace std;
    string func1()
    {
        string temp="This is func1";
        return temp;
    }
    void func2(string &str)
    {
        cout<<str<<endl;
    }
    
    int main()
    {
        func2(func1());
        func2("Tomwenxing");
        return 0;
    }
    

    编译器时会报错:error C2664: “func2”: 不能将参数 1 从“const char [11]”转换为“std::string &”。

    这是由于func1()和“Tomwenxing”都会在系统中产生一个临时对象(string对象)来存储它们,而在C++中所有的临时对象都是const类型的,而上面的程序试图将const对象赋值给非const对象,这必然会使程序报错。如果在函数func2的参数前添加const,就没问题了。

    3、指针和引用的区别

    1. 引用必须初始化,指针可以不用
    2. 引用不能为空,指针可以
    3. 引用不能更换绑定对象,指针可以更换指向对象
    4. 引用不占内存,指针占用内存
    5. 不能声明引用数组,可以声明指针数组
    6. 不能引用 引用的引用(int&& b = a),可以定义指针的指针

    4、总结

    1. 在引用的使用中,单纯给某个变量起别名是毫无意思的,引用的目的主要用于函数参数的传递中,解决大块数据或对象的传递效率和空间不如意的问题。
    2. 用引用传递函数的参数,能保证参数在传递的过程中不产生副本,从而提高传递效率,同时通过const的使用,还可以保证参数在传递过程中的安全性。
    3. 引用本身是目标变量或对象的别名,对引用的操作本质上就是对目标变量或对象的操作。因此能使用引用时尽量使用引用而非指针。
    4. 没有void类型的引用

    感谢大家,我是假装很努力的YoungYangD(小羊)。

    参考资料:
    《C++ primer 第五版》
    https://www.cnblogs.com/duwenxing/p/7421100.html

    展开全文
  • cs代码-引用类型代表delegate它实际上相当于C#中的函数指针原型与指针不同的是代表在C#是类型安全的
  • C++ 函数传递指针引用指针指针指针的值被改变标签(空格分隔): C++ Pointer如下图的代码:容易误以为tree1的值会在函数Mod…中随着p1,p2改变,但实际上tree1与p1,p2只是在Tree这一级别一起改变,在Tree* ...

    C++ 函数传递指针的引用或指针的指针,指针的值被改变

    标签(空格分隔): C++ Pointer


    如下图的代码:容易误以为tree1的值会在函数Mod…中随着p1,p2改变,但实际上tree1与p1,p2只是在Tree这一级别一起改变,在Tree* 这一级别,就像普通的int变量之间的赋值。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Tree{
    public:
        int val;
        Tree* left;
        Tree* right;
        Tree():val(-1),left(NULL),right(NULL) {}
        Tree(int value){
            val = value;
        }
    };
    
    void ModReference(Tree*& s)
    {
        s = new Tree(5);
    }
    
    void ModPointer(Tree** s)
    {
        *s = new Tree(6);
    }
    int main()
    {
        Tree* tree1 = new Tree(3);
        Tree* p1 = tree1;
        ModReference(p1);
        cout << "Ref: tree1: " << tree1->val << " p1: " << p1->val << endl;
        Tree* p2 = tree1;
        ModPointer(&p2);
        cout << "Pointer: tree1: " << tree1->val << " p2: " << p2->val << endl;
        tree1 = p1;
        cout << "tree1: " << tree1->val << endl;
        tree1 = p2;
        cout << "tree1: " << tree1->val << endl;
    
    }

    Ref: tree1: 3 p1: 5
    Pointer: tree1: 3 p2: 6
    tree1: 5
    tree1: 6

    展开全文
  • 引用、常指针、常引用指针常量、引用常量

    千次阅读 多人点赞 2017-08-29 14:19:03
    引用的本质以及const的位置在语法和作用的区别

    标题列出了5个概念,以指针为一组,常量为一组的两组概念内部是非常容易混淆的。希望以本文来清晰区分它们。

    一. const限定符

    将const理解为一个修饰词似乎更容易理解一些。一旦出现const,一定要看清楚它究竟修饰的是什么。虽然这句话比较抽象且模糊,但接下来所述的所有内容将举出例子,理解下面的内容就会理解这句话的含义。

    如下面所看到的,所有涉及指针的概念为一组(即常指针和指针常量为一组),涉及引用的概念为一组(引用、常引用、引用常量)。

    非常清楚这些内容的人可能会说:没有引用常量这个说法。这里我们暂且先这样说,后文将会阐述清楚这个说法不存在的事实。

    二. 常指针和指针常量

    首先能看到这篇文章的读者一定清楚:const是常量,是“只读”而“不可写”的。这个说法毋庸置疑的正确,然而不够具体,因为语法上可能会出现问题,例如这节说的“常指针”和“指针常量”。

    永远不要死记硬背,下面的代码只是为了先看下“常指针”和“指针常量”在语法上长什么样子:

    const int* pt;	//常指针
    int* const ps;	//指针常量
    很显然,这两者区别就是const的位置,当然也可以说是int*位置的不同,但是int*代表int类型的指针,再看之前所说的const理解为一个修饰词,可以试着理解下面的话:

    常指针const int* pt中const修饰int*,连起来说就是“常整型指针”,但是随着指针指向的数据类型不同这个说法也将随之改变,例如const char* pt就是“常字符型指针”,因此省略中间的指针指向的数据类型名,统一称为“常指针”。

    再来看常指针的作用。仍然以const int* pt为例:const修饰了int*,并未直接修饰pt,也就是说指针变量pt并不是“只读”的,而说的是pt是指向整型常量的指针,指针指向的数据不可更改。因此常指针的作用是保护指向的数据不被更改。

    如果理解了常指针,指针常量就比较好理解了:int* const ps中,const修饰指针ps本身,因此指针ps就是“只读”的,不能再改变指针本身的值,也即不能改变指针的指向,但指向的数据却是能更改的。

    三.常引用和引用常量

    常引用和引用常量实际上跟常指针和指针常量基本一致,只不过这里把指针换成了引用就可以了,并且作用与常指针和指针常量是一致的,因此不再赘述。但是要说明:实际上不存在引用常量这个说法,也不存在引用常量这个东西。可以尝试在VS中作如下定义:

    int a=0;
    int& const b=a;
    编译时并不会报错,但是会有如下提示

    warning C4227: 使用了记时错误: 忽略引用上的限定符

    而当去掉const时此警告就会消失,也就说明了其实并不存在引用常量这个东西。

    实际上这就涉及了一个问题:引用的本质是什么?

    一般教科书上说:引用就是“别名”。确实这个说法没有大问题。但这并不是本质。

    引用不占据内存空间这种说法是错的,如果反编译看汇编代码,会发现引用实际上被解释为一个指针常量,而这也恰好符合引用本身不能更改的原则。

    这样看引用常量不存在的原因很明显了:引用本身就被解释为指针常量,再用const修饰完全没有意义。

    展开全文
  • java引用指针

    千次阅读 2018-05-06 17:45:30
    我们知道,一个引用,比如说person p 等于new person,实际上就是p这个引用指向了这个对象实体,所以本质上就是指针。但是这个指针呢,它是安全的,受控制的,也就是说我们这个指针不能乱指,所以,这里面,比如说这...
  • 智能指针有很多实现方式,android 中的sp 句柄类实际上就是google 实现的一种强引用的智能指针。我没有仔细看android sp 的实现方式,但其基本原理是固定的,现在我们从一个相对简单的例子来看智能指针的实现
  • 引用就是对象的另一个名字,使用多个变量名指向同一地址。实际程序中,引用主要用作函数形参。 复合类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。 格式: 类型名& 标示符=已声明的常变量; 2.引用...
  • 指针引用

    千次阅读 2016-07-10 00:34:57
    一、什么是引用???  "引用"是C++中引入的新的变量类型,它的作用是为一个变量起一个别名。引用的使用形式如下:  类型 &引用变量名=已定义过的变量名;  例如:int a=10;  int &b=a;  b是a的引用,即b是a的...
  • 指针变量的赋值与引用&&二重指针

    千次阅读 2018-02-13 13:13:28
    研究问题: 函数参数问题(一级指针与二级指针)?区分实参与值参? 指针变量的赋值和做函数的参数?? 指针到底是变量,还是地址??? 指针变量需要另外开辟内存存储? 要点: ...指针变量有时也可以简称为”指针”...
  • 引用是特殊指针

    千次阅读 2012-09-21 15:09:03
    实际上引用就是一个指针,只不过是个特殊的指针,编译器对它做了些特殊的处理.它也占用内存.但由于编译器做了特殊处理,你不能用&去取址,用sizeof得到的值也不会是4或者8,而是它引用的对象的size大小. 其实我们想想也...
  • 引用指针和句柄的区别

    万次阅读 多人点赞 2020-12-15 08:38:00
    句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由...
  • 指针引用总结

    千次阅读 多人点赞 2018-10-15 22:58:07
    指针 若现在指针不知道指向,可以使用NULL,例如int *b = NULL; char *a = NULL;,但是使用的时候若指针指向的是数组或者字符串等,需要提前声明大小。若是int *,则不需要,直接将一个int类型的指针赋值给它即可。 ...
  • java的引用和C++的指针有什么区别

    千次阅读 2015-07-10 22:04:21
    大多数的C++程序员转学java的时候,都有这样一个疑问,java的引用就是C++的指针吗。其实不完全对,他们之间既有前四外绿的联系, 也有很大的区别。 java的引用和C++的指针都是指向一块内存址的,通过引用或者指针...
  • 指针引用

    千次阅读 2006-10-25 11:31:00
    在下列函数声明中,为什么要同时...本文试图通过一些实际指针使用经验来解释这个问题。 仔细看一下这种声明方式,确实有点让人迷惑。在某种意义,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢?。
  • 指针指针引用

    千次阅读 2012-01-09 11:11:30
    C++之研究——指针引用 VB中的函数或过程的参数有2种传递方式:一种是值传递;一种是引用传递。分别用关键字ByVal和关键字ByRef指出。如果参数是以引用传递的话,函数或过程内部就可以靠这个引用参数来改变外部...
  • C++指针引用

    千次阅读 热门讨论 2014-02-18 21:24:18
    指针  指针是用来操纵地址的特殊类型变量,它可以作为函数参数来传递数组变量,也可以用来访问和操作内存空间。  在指针中,有两种特殊运算符:& 和 *;其中,&运算符是用来去地址的,而*运算符则是用来取值和声明...
  • 引用指针

    千次阅读 2011-09-28 17:09:40
    引用就是对象的另一个名字,在实际的程序中,引用主要用作函数的形式参数。引用是一种复合类型,通过在变量名前添加“&”符号来定义。 复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联...
  • 智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。在C++编程中,有两个很让人头痛的问题:一是忘记释放动态申请的对象从而造成内存泄露;二是对象在一个地方释放后,又在别的地方被...
  • 【C++】weak_ptr弱引用智能指针详解

    千次阅读 多人点赞 2020-05-03 15:34:11
    相比于一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将...
  • Java引用与C语言指针区别

    千次阅读 2019-04-08 17:38:07
    Java中的引用由于受到封装可以不用关心细节,而C语言的指针本质上就是一个int变量。 Java引用类型的初始值是null,而C语言指针的初始值是未知的,不可控的。 Java引用作为函数参数时,传递的是引用值的copy,在函数...
  • 引用指针的区别

    千次阅读 2014-08-26 15:22:11
    c++中的引用指针的区别  ★ 相同点:  1. 都是地址的概念;  指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。  ★ 区别:  1. 指针是一个实体,而引用仅是个别名;  2. 引用...
  • 指针引用的区别

    万次阅读 多人点赞 2018-06-04 12:05:05
    指针引用形式很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针引用,力争将最真实的一面...
  • 通过指针引用数组

    千次阅读 2018-06-13 20:49:32
    1、指针是什么? 为了说清楚什么是指针,必须先弄清楚数据在内存中是如何存储的,又是如何读取的。...内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。在地址所标志的...
  • 指针引用

    千次阅读 2009-10-10 10:54:00
    //---------------------------------------------------------------------引用是一种没有指针语法的指针.与指针一样,引用提供对对象的间接访问.--《c++ primer》p29虽然引用也可以被用作一种指针,但是象对指针...
  • 指针引用的相同点和不同点

    千次阅读 2019-09-02 16:51:51
    引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。简单点说就是声明一个标识符为引用,就表示该标识符是另一个对象的外号。 三、引用指针的相同点 1、指针引用都可以优化传参效率 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,652
精华内容 121,860
关键字:

引用实际上就是指针