关于C语言中指针*与C++中&引用的区别

&符号在C++中一定情况下起引用作用,引用是给已有的变量起别名必须初始化

而指针可以为空,也可以不初始化。

下面是测试代码

#include <iostream>
 
using namespace std;
 
int main()
{
	//这里引用有一部分就是起别名  若对别名进行引用其实就是对变量本身引用 
    int a = 88;
    int &c = a;  //声明变量a的一个引用c,c是变量a的一个别名,如果引用,声明的时候一定要初始化
    int &d = a;  //引用声明的时候一定要初始化,一个变量可以有多个引用
    
    cout<<"a="<<a<<endl;
    cout<<"c="<<c<<endl;
    cout<<"====================="<<endl;
    c=99; //如这里是对别名c的修改  其实就是对变量a的修改   修改过以后都会变   此时a为99 
    cout<<"a="<<a<<endl;
    
    int &e = ++d;
	cout<<"a="<<a<<endl; //此时输出a的值为100 
    
    return 0;
}


&(引用)==>用来传值,出现在变量声明语句中位于变量 左边时,表示声明的是引用. 

&(取地址运算符)==>用来获取首地址,在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时
                  表示取对象的地址.

总而言之,和类型在一起的是引用,和变量在一起的是取址

实例如下:1)引用在赋值=的左边,而取地址在赋值的右边,比如

int a=3;
int &b=a;        //引用
int *p=&a;        //取地址


  2)和类型在一起的是引用,和变量在一起的是取址。 举例同样如上,还有下例:

int function(int &i)
{
}  //引用


3)对于vector,上面2条同样适合

vector<int> vec1(10,1);  //initialize vec1: 10 elements, every element's value is 1
vector<int> &vec2 = vec1; // vec2 is  reference to vec1
vector<int> *vec3 = &vec2; //vec3 is addresss of vec1 and vec2

--指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义

char c = 'a';

char *p = &c; //p里面存放的是c的地址

--引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义:

int i=1;

int &r = i;    //此时i=r=1;

若执行r=2;//此时i=r=2;

int *p = &r;  //p指向r;


指针和引用的区别

1.首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。如下图中,如果定义一个引用变量,不初始化的话连编译都通不过(编译时错误)

而声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。

2.其次,引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。

3.再次,引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节

4.最后,引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)

总之,用一句话归纳为就是:指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。

本文章为转载本文为CSDN博主「司徒若寒」的原创文章,遵循CC 4.0 BY-SA版权协议

https://blog.csdn.net/qq_26501341/article/details/58192662

猜你喜欢

转载自blog.csdn.net/weixin_49418695/article/details/123323926
今日推荐