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

20 浏览
0 Comments

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

这个问题在这里已经有答案

可能是重复问题:

c++ 中函数声明中*与&的区别

我知道这对许多人来说可能似乎很基础,但是尽管我已经尝试了所有最好的谷歌搜索,但我仍然无法找到一个好的、详细的解释。我相信答案在那里,所以我的搜索词一定很糟糕。

在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。这显然不能有相同的含义。

我希望现在我讲的更有意义了?

admin 更改状态以发布 2023年5月21日
0
0 Comments

你询问的是指针(*)和引用(&),我认为这个网站讲得最清楚明白了

0
0 Comments

为了理解这个问题,首先需要理解指针和引用。我将简单地解释您问及的类型声明语法,假设您已经知道指针和引用是什么。

在 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实际上并不这样做。

0