对指针类型的引用

Reference to Pointer Type

本文关键字:引用 类型 指针      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main(void)
{
    int num[5];
    const int* &ref = num;
    return 0;
}

我读过一本C++书,其中提到了引用变量是否引用:

  1. 类型不同但可以转换的变量。
  2. 不是左值的变量。

只要引用变量声明为 const ,上述 2 种情况将使用一种方法来解决,其中编译器将创建一个存储并将值放入其中,同时引用变量的标识符被视为该特定存储位置的标识符。下面是演示代码。

案例1
#include <iostream>
using namespace std;
int main(void)
{
    int num = 5;
    const long long &ref = num; //the value 5 is place in a new storage where ref is the identifier
    return 0;
}
案例2:
#include <iostream>
using namespace std;
int main(void)
{
    int num = 5;
    const int &ref = num + 1; //expression num + 1 evaluated and store in new storage with identifier ref
    return 0;
}

既然这2个案例是有效的,为什么《守则》里面的案例是无效的呢?

我的逻辑是,因为使用数组的名称将转换为指向数组第一个元素的指针,因此编译器应该发现这不是一个左值,并且将创建一个新的存储来存储该地址,当然,引用变量名称将被视为该位置的标识符。

注意:我知道这有点偏离主题,但我可以知道数组名称是否是Lvalue吗?只需一个简单的是或否就可以了,因为将代码更改为int &ref = num我认为它不是一个左值,但我只需要进一步确认。

谢谢。

引用变量声明为常量。

const int *int * const之间是有区别的,你选错了。

您的示例 (ii( 出于同样的原因无效,应该const int &ref = num + 1;

对于您的笔记,我不确定简单的是或否是否可行。简单的数组名称是一个左值,指的是数组。但是,在大多数情况下,它会衰减到指向第一个元素的指针,这是一个右值指针。