这意味着什么是const int*&var?

seg*_*ult 25 c++

我看到有人用这个

void methodA(const int*& var);
Run Code Online (Sandbox Code Playgroud)

在一个答案中,但无法理解论证的含义.

据我所知:

  • const int var => const值,无法更改

  • const int* var =>指向int的指针,即const,即*var无法更改,但var可以更改

  • const int& var =>引用const int,即var的值不能改变

什么const int*& var意思,const int& *var也有可能?

你能不能举一些例子,比如可以做什么,用什么做不了?

更新:

我不确定我是否正确思考,但我开始认为引用是作为参数传递的变量的别名,所以const int*p; methodA(p)=>这里我们将p作为const int*传递但是我们不知道这是通过值传递还是直到我们看到方法A的定义,

所以如果methodA就像这个方法A(const int*&p2)==>这里p2是p的另一个名字,即p和p2从现在开始是相同的,如果methodA(const int*p2)==>这里p2被传递作为值,即p2只是本方法的局部,

如果我错误的想法,请纠正我?如果是,我可能需要更多地研究这个问题?你能指点一些不错的参考资料吗?

更新2如果像我这样的初学者一定要多了解这件事情,你可以使用C++东方电气/ CDECL程序,我刚刚发现非常有用从这里

$ c++decl
Type `help' or `?' for help
c++decl> explain const int&* p
declare p as pointer to reference to const int
c++decl> explain const int*& p
declare p as reference to pointer to const int
Run Code Online (Sandbox Code Playgroud)

但正如每个人都指出的那样,第一个例子在C++中是不合法的.

谢谢

GMa*_*ckG 29

它是对指向int的int的指针的引用.

实际上,这里有另一篇文章有​​点相关.我的回答提供了一种通用算法来解决这些问题.

这个:const int& *var没有意义,因为你不能有一个引用指针.

如果const和指针妨碍了,请记住你可以输入这些东西:

typedef int* IntPointer;
typedef const IntPointer ConstIntPointer;

void foo(ConstIntPointer&); // pass by reference
void bar(const ConstIntPointer&); // pass by const reference
void baz(ConstIntPointer); // pass by value
Run Code Online (Sandbox Code Playgroud)

可能会让它更容易阅读.


如果您需要有关C++的更多帮助,请阅读此内容.更具体地,参考文献.

作为变量的引用占用空间:

int i; // takes sizeof(int)
int*pi = &i; // takes sizeof(int*)

int& ri = i; // takes no space.
             // any operations done to ri
             // are simply done to i
Run Code Online (Sandbox Code Playgroud)

引用作为参数使用指针来实现最终效果:

void foo(int& i)
{
    i = 12;
}

void foo_transformed(int *i)
{
    *i = 12;
}

int main()
{
    int i;

    foo(i); // same as:
    foo_transformed(&i); // to the compiler (only sort of)
}
Run Code Online (Sandbox Code Playgroud)

所以它实际上是i在堆栈上传递地址,因此需要sizeof(int*)占用堆栈空间.但是不要开始考虑引用作为指针.他们一样.


Ste*_*utt 8

有些人发现从右到左更容易阅读.所以

const int*&

是指向const的整数的指针.

如您所知,无法更改引用,只能更改它们引用的内容.所以引用只引用一个指向const的整数的指针.由于指针不是const - 整数是const - 您可以将指针更改为指向不同的整数.

比较这个

int*const&

这是对整数的常量指针的引用.同样,引用是不可变的,在这种情况下,它是对常量指针的引用.在这种情况下你可以改变的是整数值,因为int关键字的任何一侧都没有const.

只是为了增加混淆,const int和int const是相同的.但是int const*和int*const是非常不同的.第一个是指向常量整数的指针,因此指针是可变的.第二个是指向整数的常量指针,因此整数是可变的.

希望这可以帮助!