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值上运行.这显然不具有相同的含义.
我希望我现在更有意义吗?
要理解这一点,首先需要了解指针和引用.我只是解释一下你要问的类型声明语法,假设你已经知道了什么是指针和引用.
在C中,据说"声明随后使用".这意味着声明变量的语法使用变量进行模仿:通常在声明中,您将拥有类似于int
或float
类似于表达式的基本类型.例如,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实际上并没有这样做.