C++指针和引用的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whoamiyang/article/details/54967424

1.指针与引用区别

  • 指针是一块内存的地址值,访问变量是间接访问,引用是一块内存的别名,访问变量是直接访问.
  • 引用是一个变量的别名,本身不单独分配自己内存空间,而指针有自己的内存空间.
  • 引用使用时无须解引用(*),指针需要解引用.
  • 引用只能在定义时被初始化一次,之后不可变;指针可变.
  • 引用不能为空,指针可以为空.
  • “sizeof 引用”得到的是所引用的变量(对象)的大小,而”sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小.
  • 指针和引用的自增(++)运算意义不一样.
  • 引用是类型安全的,而指针不是(引用比指针多了类型检查)

2.指针与引用联系

引用的主要功能是传递函数的参数和返回值,c++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递、引用传递。

2.1引用的三种用法

(1)独立引用

#include<iostream>

using namespace std;



int main()
{
    int a=3;
    int& b=a;//b与a绑定在一起,同生共死
    cout<<b<<" "<<a<<endl;
    b=5;
    cout<<b<<" "<<a<<endl;
    return 0;
}

(2)作为函数参数

#include<iostream>

using namespace std;

void f(int& b)//b在这里与实参a无异
{
    b++;
}

int main()
{
    int a=3;
    f(a);//a受函数体内部影响
    cout<<a<<endl;
    return 0;
}

(3)作为函数返回

#include<iostream>

using namespace std;

int& f(int* p)
{
    (*p)++;
    return *p;
}

int main()
{
    int a=3,b;
    b=f(&a)*5;
    f(&a)+=10;
    cout<<b<<" "<<a<<endl;//输出20与15
    return 0;
}
//f函数返回一个(*p)的引用,即a的引用。此引用可作为左值进行运算。

2.1指针、引用、值传递的三种

(1)”值传递”,由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响,所以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

看第二个例子和第三个例子:实际是哪个”引用”可以做的任何事情”指针都可以做”,那么为什么还要”引用”呢?
答案:用恰当的工具做恰如其分的工作.
指针能够毫无约束的操作内存中的东西,尽管指针功能强大,但是非常危险,
就像一把刀,既可以砍树,裁纸,理发,只是用一把砍树的刀用来理发有点危险而且.

3.什么情况下,不能使用引用,只能使用指针呢?

一般,在使用引用能解决问题的前提下,坚决不使用指针.
在以下情况下,你应该使用指针

  • 你考虑到存在不指向任何对象的可能(在这种情况下,你您能够设置指针为空).
  • 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。

猜你喜欢

转载自blog.csdn.net/whoamiyang/article/details/54967424