网站微信分享怎么做,如何将自己 做的网站发布网上,网站建设制作文献,加强检察门户网站建设情况转载#xff1a;http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html C#xff0b;#xff0b;中的引用与指针的区别指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址#xff08;指针指向的地址#xff09;中的内存内容及大小#xff…转载http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html C中的引用与指针的区别指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址指针指向的地址中的内存内容及大小而void*指针则只表示一个内存地址编译器不能通过该指针所指向对象的类型和大小因此想要通过void*指针操作对象必须进行类型转化。★ 相同点1. 都是地址的概念指针指向一块内存它的内容是所指内存的地址引用是某块内存的别名。★ 区别1. 指针是一个实体而引用仅是个别名2. 引用使用时无需解引用*指针需要解引用3. 引用只能在定义时被初始化一次之后不可变指针可变引用“从一而终” ^_^4. 引用没有 const指针有 constconst 的指针不可变5. 引用不能为空指针可以为空6. “sizeof 引用”得到的是所指向的变量对象的大小而“sizeof 指针”得到的是指针本身所指向的变量或对象的地址的大小typeidT typeidT 恒为真sizeofT sizeofT 恒为真但是当引用作为类成员名称时其占用空间与指针相同4个字节没找到标准的规定。7. 指针和引用的自增运算意义不一样★ 联系1. 引用在语言内部用指针实现如何实现。2. 对一般应用而言把引用理解为指针不会犯严重语义错误。引用是操作受限了的指针仅容许取内容操作。引用是C中的概念初学者容易把引用和指针混淆一起。一下程序中n 是m 的一个引用referencem 是被引用物referent。int mint n mn 相当于m 的别名绰号对n 的任何操作就是对m 的操作。例如有人名叫王小毛他的绰号是“三毛”。说“三毛”怎么怎么的其实就是对王小毛说三道四。所以n 既不是m 的拷贝也不是指向m 的指针其实n 就是m 它自己。引用的一些规则如下1引用被创建的同时必须被初始化指针则可以在任何时候被初始化。2不能有NULL 引用引用必须与合法的存储单元关联指针则可以是NULL。3一旦引用被初始化就不能改变引用的关系指针则可以随时改变所指的对象。以下示例程序中k 被初始化为i 的引用。语句k j 并不能将k 修改成为j 的引用只是把k 的值改变成为6.由于k 是i 的引用所以i 的值也变成了6.int i 5int j 6int k ik j // k 和i 的值都变成了6上面的程序看起来象在玩文字游戏没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C语言中函数的参数和返回值的传递方式有三种值传递、指针传递和引用传递。1)以下是“值传递”的示例程序。由于Func1 函数体内的x 是外部变量n 的一份拷贝改变x 的值不会影响n 所以n 的值仍然是0.void Func1(int x) { x x 10; } int n 0; Func1(n); cout “n ” n endl;// n 0 2)以下是“指针传递”的示例程序。由于Func2 函数体内的x 是指向外部变量n 的指针改变该指针的内容将导致n 的值改变所以n 的值成为10.void Func2(int *x) { (* x) (* x) 10; } #8943; int n 0; Func2(n); cout “n ” n endl; // n 10 3)以下是“引用传递”的示例程序。由于Func3 函数体内的x 是外部变量n 的引用x和n 是同一个东西改变x 等于改变n所以n 的值成为10.void Func3(int x) { x x 10; } #8943; int n 0; Func3(n); cout “n ” n endl; // n 10 对比上述三个示例程序会发现“引用传递”的性质象“指针传递”而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做为什么还要“引用”这东西答案是“用适当的工具做恰如其分的工作”。指针能够毫无约束地操作内存中的如何东西尽管指针功能强大但是非常危险。就象一把刀它可以用来砍树、裁纸、修指甲、理发等等谁敢这样用如果的确只需要借用一下某个对象的“别名”那么就用“引用”而不要用“指针”以免发生意外。比如说某人需要一份证明本来在文件上盖上公章的印子就行了如果把取公章的钥匙交给他那么他就获得了不该有的权利。——————————摘自「高质量c编程」指针与引用在More Effective C 的条款一有详细讲述我给你转过来条款一指针与引用的区别指针与引用看上去完全不同指针用操作符‘*’和‘-’引用使用操作符‘。’但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针在什么时候使用引用呢首先要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象但是该变量在某些时候也可能不指向任何对象这时你应该把变量声明为指针因为这样你可以赋空值给该变量。相反如果变量肯定指向一个对象例如你的设计不允许变量为空这时你就可以把变量声明为引用。“但是请等一下”你怀疑地问“这样的代码会产生什么样的后果”char *pc 0 // 设置指针为空值char rc *pc// 让引用指向空值这是非常有害的毫无疑问。结果将是不确定的编译器能产生一些输出导致任何事情都有可能发生应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里那么你最好完全避免使用引用要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。因为引用肯定会指向一个对象在C里引用应被初始化。string rs // 错误引用必须被初始化 string sxyzzy string rs s // 正确rs指向s 指针没有这样的限制。 string *ps // 未初始化的指针 // 合法但危险 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。void printDouble(const double rd) { cout rd; // 不需要测试rd,它 } // 肯定指向一个double值 相反指针则应该总是被测试防止其为空 void printDouble(const double *pd) { if (pd) { // 检查是否为NULL cout *pd; } } 指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象以后不能改变。string s1(Nancy); string s2(Clancy); string rs s1; // rs 引用 s1 string *ps s1; // ps 指向 s1 rs s2; // rs 仍旧引用s1, // 但是 s1的值现在是 // Clancy ps s2; // ps 现在指向 s2; // s1 没有改变 总的来说在以下情况下你应该使用指针一是你考虑到存在不指向任何对象的可能在这种情况下你能够设置指针为空二是你需要能够在不同的时刻指向不同的对象在这种情况下你能改变指针的指向。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向那么你应该使用引用。还有一种情况就是当你重载某个操作符时你应该使用引用。最普通的例子是操作符[].这个操作符典型的用法是返回一个目标对象其能被赋值。vectorint v(10); // 建立整形向量vector大小为10; // 向量是一个在标准C库中的一个模板(见条款35) v[5] 10; // 这个被赋值的目标对象就是操作符[]返回的值 如果操作符[]返回一个指针那么后一个语句就得这样写 *v[5] 10; 但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。这有一个有趣的例外参见条款30当你知道你必须指向一个对象并且不想改变其指向时或者在重载操作符并为防止不必要的语义误解时你不应该使用指针。而在除此之外的其他情况下则应使用指针假设你有void func(int* p, intr); int a 1; int b 1; func(a,b); 指针本身的值地址值是以pass by value进行的你能改变地址值但这并不会改变指针所指向的变量的值p someotherpointer //a is still 1但能用指针来改变指针所指向的变量的值*p 123131 // a now is 123131但引用本身是以pass by reference进行的改变其值即改变引用所对应的变量的值r 1231 // b now is 1231尽可能使用引用不得已时使用指针。当你不需要“重新指向”时引用一般优先于指针被选用。这通常意味着引用用于类的公有接口时更有用。引用出现的典型场合是对象的表面而指针用于对象内部。上述的例外情况是函数的参数或返回值需要一个“临界”的引用时。这时通常最好返回/获取一个指针并使用 NULL 指针来完成这个特殊的使命。引用应该总是对象的别名而不是被解除引用的 NULL 指针。注意由于在调用者的代码处无法提供清晰的的引用语义所以传统的 C 程序员有时并不喜欢引用。然而当有了一些 C 经验后你会很快认识到这是信息隐藏的一种形式它是有益的而不是有害的。就如同程序员应该针对要解决的问题写代码而不是机器本身。