各种符号(*,&等)与参数组合起来的区别是什么?
各种符号(*,&等)与参数组合起来的区别是什么?
这个问题在这里已经有答案:
可能是重复问题:
我知道这对许多人来说可能似乎很基础,但是尽管我已经尝试了所有最好的谷歌搜索,但我仍然无法找到一个好的、详细的解释。我相信答案在那里,所以我的搜索词一定很糟糕。
在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)
\"有什么区别?
如果只要您指出正确方向,我就非常愿意阅读大量的相关内容。同时,我对一般的编程概念——面向对象、泛型/模板等——非常熟悉,只是不熟悉C/C++中使用的符号。
编辑:看来我给人的印象是我不知道指针是什么。我在想怎么会这样:)
所以为了澄清:我完全理解指针的工作原理。我不理解的是,例如‘void func(int &var)’这样的语句的含义,而奇怪的是我找不到答案。在赋值语句中,\' \'运算符在右边,例如\'int * x = &y\',但在上面的例子中,\' \'运算符在实际上在左边。换句话说,它是在作用于l-value,而不是r-value。这显然不能有相同的含义。
我希望现在我讲的更有意义了?
为了理解这个问题,首先需要理解指针和引用。我将简单地解释您问及的类型声明语法,假设您已经知道指针和引用是什么。
在 C 语言中,有一句话叫做“声明在使用之后”。这意味着声明变量的语法模仿使用变量的语法:通常,在声明中,您会有一个像 int 或 float 这样的基本类型,后面是一个看起来像一个表达式的东西。例如,在 int *y 中,基本类型是 int,类似表达式的部分是 *y。之后,该表达式将计算出具有给定基本类型的值。
因此,int *y 意味着稍后表达式 *y 是一个 int。这意味着 y 必须是指向 int 的指针。函数参数也是如此,事实上整个函数声明也是如此:
int *foo(int **bar);
在上面的 int **bar 中,int **bar 表示 **bar 是一个 int,意味着 *bar 是 int 的指针,bar 是指向 int 指针的指针。它还声明,*foo(arg)将是一个 int(在 arg 为适当类型的情况下),这意味着 foo(arg)的结果是 int 的指针。因此,整个函数声明是“foo 是一个接受指向指向 int 的指针的指针的函数,并返回指向 int 的指针。”
C++添加了引用的概念,并在此过程中略微改变了 C 风格的声明。因为使用地址运算符 & 取变量的地址必须得到指针,所以 C 在声明中没有使用&的场景;int &x 表示 &x 是一个 int,意味着 x 是某种类型,在该类型上取地址的结果为 int。因此,由于这种语法未被使用,C++将其用于完全不同的目的。
在C ++中,int&x
表示x
是对int
的引用。使用变量不涉及任何“取消引用”引用的运算符,因此引用声明符与取地址运算符冲突无关紧要。相同的符号在两种不同的上下文中意义完全不同,在允许使用一种意义的上下文中从未需要使用另一种意义。
因此,char&foo(int&a)
声明一个接受对int
的引用并返回对char
的引用的函数。func(&x)
是一个表达式,它获取x
的地址并将其传递给func
。
1.实际上,在声明函数的原始C语法中,“声明跟随使用”的规则甚至更加严格。例如,您可以将函数声明为int foo(a,b)
,参数类型在其他地方声明,因此声明就像使用一样,没有额外的类型名称。
2.当然,int*&x;
也可能有意义,因为*&x
可以是一个int
,但C实际上并不这样做。