`

指针和引用

阅读更多
 转自:http://www.programbbs.com/
    在c++函数中,形式参数用 引用 和用指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数?什么时候用指针作参数呢 void function (int *ptr); void function(int &ref);
    没有 特定的规定。。学的 久了,就 会习惯什么时候用指针什么时候用引用了!
引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。
    C++中尽量用引用。个人觉得所有的引用都可以用指针,但指针比引用容易出错。
    引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针。
    C++ 中一般都用引用就可以了 ... C 中没有引用,就使用指针 ....
    举例如下:
1 使用指针传递参数时:
void function (int *ptr) { 函数体;}
调用该函数时
main()
{ int p; function (&p); }
2 使用引用传递参数时:
void function(int &ref) { 函数体;}
调用该函数时
main()
{ int p; function (p); }
由此可见,使用引用比使用指针传递参数函数调用时更简单,引用和指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时,
对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。

    指针和引用的差别
1. 非空的差别任何情况下都不能使用指向空值的引用.一个引用必须总是指向某个对象. 不存在的指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高.
2. 合法性区别在使用引用之前不需要测试他的合法性.指针必须测试.
3. 可修改区别指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变.
应该使用指针的情况: 可能存在不指向任何对象的可能性 需要在不同的时刻指向不同的对象(此时,你能够改变指针的指向)
应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用引用。
   
要首先好好理解指针和引用的区别
    指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。
指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,
但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,
例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”
  char *pc = 0; // 设置指针为空值
  char& rc = *pc; // 让引用指向空值
  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。
如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。
  因为引用肯定会指向一个对象,在C里,引用应被初始化。
  string& rs; // 错误,引用必须被初始化
  string s(\"xyzzy\");
  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 没有改变
  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),
二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
 还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
  vector<int> v(10); //建立整形向量(vector),大小为10
                    //向量是一个在标准C库中的一个模板
  v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值
  如果操作符[]返回一个指针,那么后一个语句就得这样写:
  *v[5] = 10;
  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用
  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。
而在除此之外的其他情况下,则应使用指针 。
分享到:
评论

相关推荐

    C++重要的谨记指针和引用的区别

    在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...

    C++指针与引用的区别

    指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用...

    指针和引用的相同点和不同点的总结.pdf

    ### 指针和引用的相同点和不同点的总结 #### 相同点: - **地址的概念**:无论是指针还是引用,在C++中都与内存地址有关联。它们都可以用来表示或访问内存中的数据。 #### 不同点: 1. **实体与别名**: - **...

    指针和引用的区别

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于任何C++程序员来说都是至关重要的。以下是对指针和引用的详细解析...

    c++指针和引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们允许程序员对内存进行直接操作,提高代码的灵活性和效率。对于初学者来说,理解并熟练掌握这两个概念至关重要。 首先,我们来探讨指针。指针在C++中扮演着...

    c++指针和引用的使用浅谈

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来对比它们的使用方法和特性。 首先,指针是C++中的一种特殊类型,它存储的是一个...

    **p与 *&p的区别, 即指向指针的指针和引用指针变量的区别

    在C语言中,**p与*&p是两个常见的指针操作表达式,它们分别涉及到指向指针的指针和引用指针变量的概念。理解这两者的区别,有助于更准确地掌握指针的操作和内存管理。 首先,我们需要明确**p的含义。当声明一个指针...

    使用指针和引用处理虚函数实例

    在C++编程语言中,指针和引用是两种非常重要的概念,它们经常被用来处理对象间的交互,尤其是在涉及多态性(polymorphism)时,如虚函数的应用。本实例“使用指针和引用处理虚函数实例”着重探讨了如何通过这两种...

    C++指针和引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,旨在为初学者提供一个清晰的理解基础。 首先,我们来了解一下**指针**。指针是C++中的一种特殊...

    C++指针与引用

    此时,使用指针引用就显得尤为重要了。 例如,如果我们想要在函数`func1`中更新`pMyClass`所指向的对象,而不只是修改`pMyClass`本身的值,我们可以这样声明函数: ```cpp void func1(MYCLASS*& pMyClass) { ...

    C++习题(指针和引用)[参考].pdf

    在C++编程语言中,指针和引用是两种非常重要的概念,它们允许我们间接地访问和操作内存中的数据。以下是一些关于指针和引用的知识点: 1. 指针定义与初始化: - 指针可以用来存储变量的地址。例如,`int x, *p1, *...

    类中使用指针和引用

    ### 类中使用指针和引用 #### 知识点概览 本文主要讲解了如何在C++类中使用不同类型的指针以及引用。这包括理解类中的指针数据成员、指向对象的指针、指向数据成员的指针、以及指向成员函数的指针等关键概念。掌握...

    指针和引用的区别1

    - 操作指针可能涉及解引用和地址运算符。 - 指针可能会引起空指针异常,如果不小心将NULL指针解引用。 2. 引用: - 引用不是独立的变量,它只是一个已存在对象的别名。一旦引用被初始化,就不能改变引用的对象。...

    指针、引用、结构体、线性表(顺序表、单向链表)

    (1)使用指针和引用两种方式,完成两个学生的交换。 (2)定义一个结构体类型student,写一个函数,根据学号或者成绩,对包含有n个学生的结构体数组进行排序,学生的结构体至少包括3个成员(学号,姓名,入学分数等...

    20240109_第8章 指针和引用作业_选择题讲解.rar

    指针操作有三种:声明、解引用和指针算术。声明指针后,可以使用*运算符对指针进行解引用,来访问或修改指针所指向的值,如`*p = 10;`。指针算术允许我们移动指针到数组或其他连续内存区域的其他位置,例如,如果`p`...

    C++指针和引用(PPT文档).ppt

    本资源主要介绍了C++语言中的指针和引用概念,包括指针的概念、指针变量、指针与数组、指针与函数、指针数组与二级指针、动态分配/释放内存、引用等知识点。 1. 指针的概念 指针是内存单元的地址,数据是内存单元...

    C指针和引用实用PPT学习教案.pptx

    C指针和引用是C++语言中的核心概念,它们提供了对内存直接操作的能力,从而实现高效和灵活的编程。指针允许程序员访问内存地址,动态分配内存,以及创建复杂的数据结构,如链表和树。然而,不当使用指针可能导致程序...

    指针和引用pptPPT学习教案.pptx

    指针和引用是C++编程语言中的核心概念,它们提供了对内存直接操作的能力,从而实现高效的数据处理和复杂的程序设计。下面将详细讲解这两个概念。 首先,指针是C++中用于存储内存地址的特殊变量。它允许我们通过内存...

Global site tag (gtag.js) - Google Analytics