c++ 为什么使用int*&而不是int&* 来声明对指针的引用

anauzrmj  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(148)

我认为&*只是声明指针和引用的语法约定,但是当试图声明对int*的引用时,我必须使用int*&,否则我会得到这个错误:
错误:无法声明指向“int&”的指针
这个设计背后有什么道理吗?为什么我们使用int*来声明指向整数的指针,而不是int&,反之亦然?

v09wglhw

v09wglhw1#

(1)引用不是指针(尽管它可以在内部实现)。例如,不能有未初始化的引用:

int* p; // fine - it can be initialized later
int& r; // compile time error - it needs to be initialized

(2)顺序很重要:*&&*不同。
(3)要解码c/c++声明,请使用**“右-左规则”**。这就是你如何阅读你的声明:

(4)有一个网站可以帮助你理解/解码c声明(不是c++,但在很多情况下已经足够好了):cdecl.org
[编辑,感谢@Jan Schultke] cdecl+似乎也处理c++声明。

ubof19bj

ubof19bj2#

我认为&*只是声明指针和引用的语义约定,但是当试图声明一个int指针的引用时,我必须使用int*&,否则它会出错为error: cannot declare pointer to ‘int&’
它们不仅仅是惯例;它们是 C++ 的规则。
此外,为什么我们使用int* 而不是int&声明整数指针,反之亦然?
从根本上讲,我们没有理由必须用一个字符来表示任何特定的概念。我们可以指定*代表加法,}代表大象。碰巧的是,*在开发C语言时被选为指针。我希望它的选择主要是基于当时使用的字符集和键盘中有哪些字符,以及哪些其他字符被赋予了其他含义。.可能被用作指针。但是选择了*
当C开发时,&可能被选择用于引用,因为它已经与地址相关联,因为它在C中用于获取对象或函数的地址。
所以,这就是为什么我们最终使用*&来表示指针和引用。
接下来,我们为什么要写int *&来表示指针的引用,这源于声明的语法是如何设计的。作为Kernighan and Ritchie told us in The C Programming Language,声明显示了一种如何使用标识符的图片。int *x意味着*x将用作int,因此x必须是指向int的指针。
int *x*x部分称为 * 声明器 *。declarator 可能很复杂,比如int *(*x)[3],它声明了一个指向int的3个指针数组的指针。由于声明符的概念给我们提供了如何使用标识符的图片,声明符给我们提供了图片表达式的最终类型,因此我们必须展开声明符-在某种意义上反向解析它-以弄清楚声明的标识符的类型是什么。
在C
中,引用的&被附加到这个现有的语法结构上。因此,即使我们不会在表达式中写入*&x,我们仍然使用相同的逻辑来解析它。因此&x结合得更紧密。所以int *&x告诉我们*&xint,所以&x是指向int的指针,所以x是指向int的指针的引用。
如果我们写int &*x,这意味着&*xint,所以*x是对int的引用,所以x是对int的引用的指针。但是,C没有定义指向引用的指针。从语法上讲,我们可以理解这个声明告诉我们什么,但是它告诉我们x的类型不是由C标准定义的,所以编译器会抱怨它。

7gyucuyw

7gyucuyw3#

在C++中,int*&声明用于声明对整数指针的引用,而int&* 不是有效的声明。让我们来分析一下两者之间的差异:
int*&:声明一个指向整数的指针的引用。这意味着引用本身(&)被绑定到一个指针(*),该指针可以指向一个整数(int)。它允许您修改指针本身或它所指向的值。

相关问题