引用与指针有什么区别 白蒿与茵陈有什么区别

引用和指针有何区别?何时只能使用指针而不能使用引用?

指针是变量的地址,通过指针可以访问到变量所在的内存单元,从而达到改变变量的目的。

例如,现在又变量 int a;a的内存单元地址是 0x2008,我现在定义一个int * p;, p=&a; 那么现在 p 的内容就是 0x2008,我执行 *p=1;就是找到地址为0x2008的 内存单元,并把 1 存入该内存单元。显然结果是 a 的值变成了1。

引用就不一样了。引用相当于起了一个别名。就好像一个人有两个名字,你使用这两个名字的效果是一样的。当引用做函数形参时,函数不再申请临时变量,而是直接使用被引用的变量。

例如:int a=0;

void change (int & b)

{

b=2;

}

change(a);这段代码中的函数 change 形参是引用,调用该函数时,它直接处理变量 a ,因为形参是引用,它直接使用被引用的对象,即 a 。

你说的只能使用指针而不能使用引用的情况我没见过。感觉都可以用,只不过使用的方式不一样罢了。

指针的与“引用”的区别

C++编程中指针与引用的区别一、指针和引用的区别(1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也有可能不指向对象则必须使用 指针.由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值.String & rs = string1;由于没有所谓的 null reference 所以在使用前不需要进行测试其是否有值,而使用指针则需要测试其的有效性.(2)指针可以被重新赋值而reference则总是指向最初或地的对象.(3)必须使用reference的场合. Operator[] 操作符 由于该操作符很特别地必须返回 [能够被当做assignment 赋值对象] 的东西,所以需要给他返回一个 reference.(4)其实引用在函数的参数中使用很经常.void Get***(const int& a) //这样使用了引用又可以保证不修改被引用的值{}★ 相同点:1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。★ 区别:1. 指针是一个实体,而引用仅是个别名;2. 引用使用时无需解引用(*),指针需要解引用;3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”4. 引用没有 const,指针有 const,const 的指针不可变;5. 引用不能为空,指针可以为空;6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。7. 指针和引用的自增(++)运算意义不一样; 二、C++中指针传递与引用传递(进一步整理)从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使......余下全文>>

函数形参 引用和指针有什么区别

关于指针和引用的区别,首先要了解变量声明的实质。

先看一个代码

int a=10;该语句其实是在栈上分配了一块内存空间,整数类变量占用4字节,所以这句代码的意思就是分配了一块连续4字节的内存空间,并往该空间存入10 。a代表着这块内存空间的首地址(简称地址,下同),a是个代名,一个标示符,这个名字只存在于源代码,编译之后就是个地址。

所以当定义一个变量时,一个变量其实包含两个属性,地址(占用内存空间)和值,名称代表地址,而当执行赋值语句时,编译器默认往a代表的地址中存入数据(存入所在内存空间),而不是改变地址。

再看一段代码

int a=10;int &b=a;声明一个整数类的引用,名称为b,如果说变量含有地址和值两个属性,那么引用不能称为变量,它不具备自己所代表的内存空间更没有自己的值,它仅仅就是个代名词,它什么都没有,所谓徒有虚名,没有实质,它只是a的一个别名,或者说它是借用了a的地址和值,当对b赋值或其他访问时,等于直接在访问a。编译之后也是a的地址。

再看一段代码

int a=10; int *p=&a;这段代码的后一句声明了一个指针变量,并取a的地址赋值给p,既然是变量,它就包含2个属性:地址和值,与其他变量不同,它专门用于保存其他变量的地址(地址是个无符号整数,没见过门牌号码是负的^_^),此处p所在内存空间存入a的地址,当然p同样代表自己的地址。

最后再看段代码

void main(){ int a=10; int &b=a; int *p=&a; fun1(b); fun2(p); cout<

虽然调用fun2,fun2的形参是指针变量,因此主函数中将p传入fun2,由于p是个变量(指针变量),是变量都有自己的内存空间和值(此处p的值是a的地址),对于变量传递,编译器会复制一份值COPY,因此在函数fun2内部,首先为ptr被分配一个内存空间(创建局部变量,函数退出时释放),然后将外部p的值复制到ptr中,也就是a的地址被复制到ptr中。然后执行*ptr++,就是对ptr所指向的地址中的值加一,也就是对a的值加一。函数通过ptr间接对a操作。

总结:

引用作为形参传入函数时,不做任何处理直接使用,而指针作为形参传入函数时,要为形参分配内存空间创建一个临时局部变量,并将实参指针的值复制到形参中。

引用与指针有什么区别?!

最大的区别:指针可以为NULL,引用不能引用NULL。 引用是一个对象别名,引用和被引用对象其实就是一个东西,做函数参数不需要不需申请形参内存。

相关文章

  • 感染狂犬病有什么症状 狂犬病初期有什么症状
  • 糖变质是什么样子 变质的酸奶是什么样子
  • 居家养老什么意思 什么是居家养老
  • 装修房子人工费怎么算 房子的装修面积怎么算
  • 美瞳线多久后可以化妆 做美瞳线多久可以化妆
  • 立方体的表面积怎么求 长方体的表面积怎么求
  • 药银有什么作用和功效 白酒有什么功效和作用
  • 蛮子上单怎么打鳄鱼 龙龟上单怎么打鳄鱼
  • 阴阳互补英语怎么说 阴阳人英语怎么说
  • 飘的拼音是什么 飘荡奔逸的拼音是什么
  • 网友分享和推荐的实用文章和资料只是为了提供更多的参考信息,不代表本站的立场或赞成其观点,若有事宜请联系我们,服务邮箱xkynjf#126.com(将#换成@)
    © 星空实用网