C++指针与引用
in 代码 with 0 commentand 379 read

C++指针与引用

in 代码 with 0 commentand 380 read

最近在刷面试题集,发现之前理解的指针与引用这对基友误解而且含糊不清,查了下资料,详细整理出区别与应用。

什么是引用(reference) 与指针(pointer)

引用(reference): 引用只是别名,不是实体类型(也就是说c++编译器不为引用单独分配内存空间),对一个对象的引用,就是直接对这个对象的操作。

int a = 3; //定义了一个整形变量a,并且赋初值3 
int & ra = a;//定义了一个引用 ra ,ra与变量占有同一块内存空间 
a = 4; //此时 a 与ra 的值都为 4; 
ra = 5;//此时 a 与 ra的值都是5;

指针(pointer):指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;
int a=1;int *p=&a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

引用的注意事项

  1. 引用必须初始化(引用必须指向所引用的对象)
int a = 3;
int& ra = a;
int &b ;//错误,引用必须初始化
const int &b = 10;//正确对字面值常量10的引用
  1. 引用不能为空
    int &b ;//错误,引用不能为空必须有所引用的对象
  2. 引用不能更换目标
#include<iostream>
using namespace std;
int main(){
    int a = 3;
    int b = 4;
    int& ra = a;
    // int& ra = b;//错误,多次初始化
    return 0;
}

指针的注意事项

野指针
网上看了那么多的指针的坑操作,总结一条就是避免任何形式的“野指针”。如:

指针和引用的区别

函数间传递方式
存在指针数组 ,不存在引用数组
int* a[3] ={&x,&y,&z };//定义了一个有三个整形指针变量的指针数组 a ,合法
int& a [3] ={x,y ,z};//报错,不允许使用引用数组,因为引用没有内存的分配
指针可以有多级,但是引用只能是一级
int **p;//合法 
int &&a; //不合法
可以有const指针,但是没有const引用;
指针和引用的自增(++)运算意义不一样;

9S1D(GEYP(U{7NK2G4XLQKE.png
注:这张图很有点东西,很直观地解释了引用、指针和对数组在内存的移动特点以及不长,我已经在此类题目上栽了很多次。

指针与引用的联系

在c++底层中,引用是通过指针实现的。也就是说,在实现层面上,引用就是指针,但是从c++的程序语言层面上来说,引用不是实体类型(不为引用单独分配内存空间)

评论