我认为&和*只是声明指针和引用的语义约定,但是当试图声明一个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告诉我们*&x是int,所以&x是指向int的指针,所以x是指向int的指针的引用。 如果我们写int &*x,这意味着&*x是int,所以*x是对int的引用,所以x是对int的引用的指针。但是,C没有定义指向引用的指针。从语法上讲,我们可以理解这个声明告诉我们什么,但是它告诉我们x的类型不是由C标准定义的,所以编译器会抱怨它。
3条答案
按热度按时间v09wglhw1#
(1)引用不是指针(尽管它可以在内部实现)。例如,不能有未初始化的引用:
(2)顺序很重要:
*&
与&*
不同。(3)要解码c/c++声明,请使用**“右-左规则”**。这就是你如何阅读你的声明:
(4)有一个网站可以帮助你理解/解码c声明(不是c++,但在很多情况下已经足够好了):cdecl.org
[编辑,感谢@Jan Schultke] cdecl+似乎也处理c++声明。
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
告诉我们*&x
是int
,所以&x
是指向int
的指针,所以x
是指向int
的指针的引用。如果我们写
int &*x
,这意味着&*x
是int
,所以*x
是对int
的引用,所以x
是对int
的引用的指针。但是,C没有定义指向引用的指针。从语法上讲,我们可以理解这个声明告诉我们什么,但是它告诉我们x
的类型不是由C标准定义的,所以编译器会抱怨它。7gyucuyw3#
在C++中,int*&声明用于声明对整数指针的引用,而int&* 不是有效的声明。让我们来分析一下两者之间的差异:
int*&:声明一个指向整数的指针的引用。这意味着引用本身(&)被绑定到一个指针(*),该指针可以指向一个整数(int)。它允许您修改指针本身或它所指向的值。