各种符号(*,&等)与参数结合的区别是什么?

bur*_*rfl 4 c++ syntax notation

可能重复:
c ++*vs&in函数声明

我知道这对你们许多人来说似乎是一个非常基本的问题,但我真的有一个不可能的时间找到一个好的,彻底的解释,尽管我最好的谷歌搜索.我确定答案就在那里,所以我的搜索条件一定很糟糕.

在C++中,各种符号及其组合用于标记参数(以及这些参数的参数).究竟是什么意思呢?

例:void func(int *var)和之间有什么区别void func(int **var)?怎么样int &var

同样的问题代表返回类型以及参数.int& func(int var)int* func(int var)?相比,意味着什么?在论证中,有何y = func(*x)不同y = func(&x)

如果你能指出我正确的方向,我非常乐意阅读关于这个主题的大量文章.另外,我对一般编程概念非常熟悉:OO,泛型/模板等,而不是C/C++中使用的符号.

编辑: 似乎我可能给人的印象是我不知道指针是什么.我想知道那是怎么回事:)

所以为了澄清:我完全理解指针是如何工作的.我没有抓住,奇怪地无法找到答案的意思是,例如'void func(int&var)'.在一个赋值语句的情况下,"&"运算符将是对右侧,如在"诠释*X =&Y;",但在上述中,"&"操作者实际上是在左手侧.换句话说,它是在l值上运行,而不是在r值上运行.这显然不具有相同的含义.

我希望我现在更有意义吗?

bam*_*s53 9

要理解这一点,首先需要了解指针和引用.我只是解释一下你要问的类型声明语法,假设你已经知道了什么是指针和引用.

在C中,据说"声明随后使用".这意味着声明变量的语法使用变量进行模仿:通常在声明中,您将拥有类似于intfloat类似于表达式的基本类型.例如,int *y在基类型中int,表达式看起来相似*y.此后,该表达式求值为具有给定基本类型的值.

所以int *y意味着以后表达式*y是一个int.这意味着y必须是指向int的指针.对于函数参数也是如此,事实上对于整个函数声明:

int *foo(int **bar);
Run Code Online (Sandbox Code Playgroud)

在上面int **bar说的**bar是一个int,暗示*bar是一个指向int bar的指针,并且是指向int的指针.它还声明*foo(arg)将是一个int(给定arg适当的类型),暗示会foo(arg)产生指向int 的指针.¹所以整个函数声明读取"foo是一个函数,它指向指向int的指针,并返回指向int的指针."

C++添加了引用的概念,并在此过程中稍微混淆了C样式声明.因为使用address-of运算符获取变量的地址&必须产生指针,所以C &在声明中没有任何用处; int &x意味着&x是一个int,暗示这x是某种类型,其中获取该类型的地址导致int.²因此,因为这种语法未被使用,C++将其用于完全不同的目的.

在C++中int &x意味着它x是对int的引用.使用该变量不涉及任何运算符来"取消引用"引用,因此引用声明符号与address-of运算符冲突无关紧要.相同的符号在两个上下文中意味着完全不同的东西,并且在允许另一个上下文的上下文中从不需要使用一个含义.

因此char &foo(int &a)声明一个函数接受一个int的引用并返回一个char的引用.func(&x)是一个表达地址x并传递给它的表达式func.


事实上,在用于声明函数声明的原始C语法中,遵循使用'甚至更严格地遵循.例如,你将一个函数声明为,int foo(a,b)并且参数的类型在别处被声明,因此声明看起来就像一个use,没有额外的类型名.

2.当然int *&x;可能有意义,因为它*&x可能是一个int,但C实际上并没有这样做.

  • 我在这里为你写了一个很棒的赞美,但忘记点击“添加评论”按钮,不再记得我说了什么。非常彻底,非常准确,并且非常有帮助。你看穿了我天真的面纱,找出了我困惑的根本原因。 (2认同)

Sha*_*ter 5

您所询问的内容称为指针(*)和对(&)的引用,我认为最好在这里解释

  • cplusplus.com 上没有什么是“最好解释的”。没有什么。 (3认同)