C++中按引用传递 和 指针

以下是一些归纳:

1)引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值.
(2)不存在NULL引用,引用必须与合法的存储单元关联;而指针则可以是NULL.
(3)引用一旦被初始化为指向一个对象,它就不能被改变不另一个对象的引用;(地址不可变) 而指针在任何时候都可以改变为指向另一个对象.给引用赋值并不是改变它和原始对象的绑定关系.
(4)引用的创建和销毁并不会调用类的拷贝构造函数
(5)在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换.

// 引用-指针.cpp : Defines the entry point for the console application. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int x=123; int y=456; int z=789; /* 必须初始化*/ #if 0 int &b; b=x; //will be error, 因为b=x其实只是赋值,而不是赋予地址。 b=&x;//赋予地址 &b=&x; //ERROR: 左操作数不符合=要求。(不允许对其地址赋值,必须在初始化时赋) #endif int &b=x; /* 1)引用其实只是将b和x是同一个内存地址且不可改变, 2) 而且如果引用将值改变了那么原来变量的值也就改变了 */ { printf(" 1)引用其实只是将b和x是同一个内存地址且不可改变,/n 2) 而且如果引用将值改变了那么原来变量的值也就改变了/n"); printf("&x:%d/n&b:%d/n b:%d/nx:%d/n/n",&x,&b,b,x); b=y; printf("&x:%d/n&b:%d/n b:%d/n x:%d/n/n",&x,&b,b,x); #if 0 /* 引用 地址是不可变的 */ b=&z;//compiler error:cannot convert from 'int *' to 'int' #endif } /* const的引用,只是引用的值不可改变(不是只地址,地址本来就不可改变)*/ { printf("const的引用,只是引用的值不可改变(不是只地址,地址本来就不可改变)/n"); const int &c=x; #if 0 c=y; //compiler error:you cannot assign to a variable that is const #endif x=z; printf("&x:%d/nx:%d/n&z:%d/nz:%d/n",&x,x,&z,z); } /* 指针是可以移动的,也就是他的地址是可以改变的。*/ { printf("指针是可以移动的,也就是他的地址是可以改变的/n"); int *p; p=&x; printf("&x:%d/np:%d/n*p:%d/n",&x,p,*p); p=&y; printf("&y:%d/np:%d/n*p:%d",&y,p,*p); } scanf("%d",&x); return 0; }

C++中按引用传递 和 指针