C++指针和引用的区别

    xiaoxiao2025-01-29  17

    文章目录

    1. 指针和引用区别:2.引用占用内存吗3.C++数组引用讨论:

    1. 指针和引用区别:

    指针:

    指向一块内存,它的内容是所指内存的地址,使用过程中可以更改被指内存的内容;指针可以为空,可以在使用过程中指向其它地址,(不专心);

    引用:

    某块内存的别名,在使用过程中引用不可以改变指向(虽然引用不可以改变指向,但是可以改变初始化对象的内容)。定义一个引用的时候,必须初始化,要不然编译报错。

    在指针和引用传递参数时,一般选则引用会比较安全一些,因为引用被初始化后就不能被更改了。当然也可以使用const指针 int *const p:指向int类型的const指针,指针不能更改,编译阶段会报错 const int*p:指向const变量的int*指针,指针的值可以更改,但是指针所指的内存是无法修改的。 如下形参是const指针,其指向是无法修改的,

    void print_value(int* const a){ *a = 666; //a是aaa的别名,相当于修改了aaa。 //int b = 444; //a = &b; }

    引用例子示范: 从上面的运行的结果看,虽然引用是一个别名,操作别名,就相当于操作原始变量。如上面引用变量地址和原始变量一致。

    2.引用占用内存吗

    基于VS2010反汇编的结果来看,引用是申请内存的

    0005154E push 3 00051550 push 2 00051552 push 1 00051554 lea ecx,[t1] #取出ti对象地址到ecx寄存器。 00051557 call `wmain'::`2'::t_demo::t_demo (515D0h) 36: t_demo &ref_t1 = t1; //这里定义引用ref_t1 0005155C lea eax,[t1] #取出ti对象地址到eax寄存器。 0005155F mov dword ptr [ref_t1],eax //这里将t1对象地址,保存到ref_t1指向的内存中 37: t_demo *t1_addr = &ref_t1; 00051562 mov eax,dword ptr [ref_t1] //将ref_t1指向内存的内容,保存到eax中 00051565 mov dword ptr [t1_addr],eax //将t1保存到t1_addr指向的内存中。 38: int size_ref_t1 = sizeof(ref_t1); 00051568 mov dword ptr [size_ref_t1],0Ch 39: return 0; 0005156F xor eax,eax 40: }

    上面最重要的就是下面2行代码,如果ref_t1,不申请内存的话,那么第二行赋值语句肯定是要报错的。探索到这里,分析引用到底占不占用内存,也没多大意义。一般引用变量是局部变量,使用之后不久就要释放了。(网上也有人讨论引用是不占用内存)

    0005155C lea eax,[t1] #取出ti对象地址到eax寄存器。 0005155F mov dword ptr [ref_t1],eax //这里将t1对象地址,保存到ref_t1指向的内存中

    反汇编运行代码 上面监听能看到,引用地址和对象地址都是一样的。但用sizeof去计算引用对象大小时,和其引用对象大小是一样的。

    3.C++数组引用讨论:

    https://www.cnblogs.com/yqskj/articles/2207168.html

    最新回复(0)