C++ 引用和指针

参数传递的本质是什么?

参数的传递本质上是一次赋值的过程,赋值 <---> 对内存进行拷贝 <---> 将一块内存上的数据复制到另一块内存上

C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制。

引用是什么?

引用可以看作是数据的一个别名,同个这个别名和原来的名字都能找到这份数据。

引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,这有点类似于const变量(常量)。

#include <iostream>
using namespace std;
int main() {
    int a = 99;
    int &r = a;
    cout << a << ", " << r << endl;
    cout << &a << ", " << &r << endl;
    return 0;
}
/*运行结果:*/
99, 99
0x6ffe04, 0x6ffe04

由于引用和原始变量都指向同一地址,所以通过引用也可以修改原始变量中所存储的数据。如何限制通过引用修改原始的数据?

可以在定义时添加const限制,const int &r = a; 或者 int const &r = a;

引用作为函数参数

在定义或声明函数时,可以将函数的形参指定为引用的形式,这样可以在函数内部影响函数外部数据。

引用作为函数返回值

#include <iostream>
using namespace std;
int &plus10(int &r) {
    r += 10;
    return r;
}
int main() {
    int num1 = 10;
    int num2 = plus10(num1);
    cout << num1 << " " << num2 << endl;
    return 0;
}
/*运行结果:*/
20 20

注意:引用作为函数返回值时,不能返回局部数据(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁。

引用的本质是什么?

通过&r获取的不是r的地址,而是a的地址,r和a指代的是同一份内存。是不是r这个变量不占用独立的内存?

变量r是占用内存的,而是编译器不让获取它的地址。r存储的是变量a的地址,这说明引用和指针非常相似。
引用只是对指针进行了简单的封装,它的底层依然是通过指针实现的。

引用和指针的区别

1.引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针在定义时不必赋值,也可以指向任意数据。

2.可以有const指针,但是没有const引用。因为引用本来就不能改变指向,加上const多此一举。

3.指针可以有多级,但是引用只能有一级。例如:int **p是合法的,而int &&r是不合法的。

4.指针使用++表示指向下一份数据,引用使用++表示它所指代的数据本身加1。

引用不能绑定到临时数据

指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘不能寻址。

放在内存中的内容都可以使用&来获取地址,进而用指针指向它们。
但是像表达式的结果、函数的返回值等临时数据,它们可能放在内存中,也可能放在寄存器中。一旦被放在寄存器中,就没法用&获取地址了。

常量表达式虽然在内存中,但是没法寻址。为什么?

因为常量表达式在编译阶段就可以求值。编译器不会分配单独的内存来存储常量表达式,而是将常量表达式的值和代码一起放在代码区,会被硬编码到指令中,不能寻址。

引用和指针都不能绑定到无法寻址的临时数据。

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12350589.html