各种符号(*、&等)与参数组合有什么区别? [复制]

2023-12-01

可能的重复:

我知道这对你们许多人来说可能是一个非常基本的问题,但尽管我尽了最大的努力,但我确实很难找到一个好的、彻底的解释。我确信答案就在那里,所以我的搜索词一定很糟糕。

在 C++ 中,使用各种符号及其组合来标记参数(以及这些参数的实参)。它们的具体含义是什么?

例如: 之间有什么区别void func(int *var) and void func(int **var)?关于什么int &var?

同样的问题代表返回类型和参数。什么是int& func(int var)平均值,相比于int* func(int var)?在争论中,如何y = func(*x)与......不同y = func(&x)?

如果您能为我指出正确的方向,我非常乐意阅读有关该主题的大量书籍。另外,我非常熟悉通用编程概念:OO、泛型/模板等,只是不熟悉 C/C++ 中使用的符号。

EDIT:看来我可能给人的印象是我不知道指针是什么。我想知道怎么会这样:)

因此,为了澄清:我完全理解指针是如何工作的。我是什么not我很奇怪地无法找到答案,例如“void func(int &var)”的含义。在赋值语句的情况下,“&”运算符将位于右侧,如“int* x = &y;”中所示,但在上面的情况下,“&”运算符实际上位于左侧。换句话说,它是对左值进行操作,而不是对右值进行操作。这显然不能具有相同的含义。

我希望我现在变得更有意义了?


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

在 C 语言中,据说“声明遵循使用”。这意味着声明变量的语法模仿使用变量:通常在声明中您将有一个基本类型,例如int or float后面跟着一些看起来像表达式的东西。例如在int *y基本类型是int表达式看起来很相似是*y。此后,该表达式计算为具有给定基类型的值。

So int *y意味着稍后的表达式*y is an int。这意味着y必须是一个指向 int 的指针。这同样适用于函数参数,实际上也适用于整个函数声明:

int *foo(int **bar);

在上面的int **bar says **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++ 将其用于完全不同的目的。

In C++ int &x意思是x是对 int 的引用。使用变量不涉及任何运算符来“取消引用”引用,因此引用声明符符号与地址运算符冲突并不重要。相同的符号在两种上下文中意味着完全不同的事物,并且永远不需要在允许另一种含义的上下文中使用一种含义。

So char &foo(int &a)声明一个函数,该函数接受对 int 的引用并返回对 char 的引用。func(&x)是一个取地址的表达式x并将其传递给func.


1. In fact in the original C syntax for declaring functions 'declarations follow use' was even more strictly followed. For example you'd declare a function as int foo(a,b) and the types of parameters were declared elsewhere, so that the declaration would look exactly like a use, without the extra typenames.

2. Of course int *&x; could make sense in that *&x could be an int, but C doesn't actually do that.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

各种符号(*、&等)与参数组合有什么区别? [复制] 的相关文章

  • 如何引用 .net 可执行文件中的类?

    IL 反汇编程序显示了我想在项目中使用的 Net 可执行文件中的类 我如何使用我自己项目中的这些类 从 Visual Studio 上的项目添加对该可执行文件的引用 您应该有权访问它定义的公共类 可执行文件是一个像任何其他程序集一样的程序集
  • Hololens 应用程序将不再构建 - 引用元数据文件丢失且找不到 c-Sharp.firstpass

    我已按照 Microsoft 在其多个项目下列出的确切步骤进行操作微软全息 学院 https developer microsoft com en us windows holographic academy教程 我完成了所有这些 并且从创
  • 为什么我需要显式编写“auto”关键字?

    我正在从 C 98 转向 C 11 并且已经熟悉了auto关键词 我想知道为什么我们需要明确声明auto编译器是否能够自动推导类型 我知道 C 是一种强类型语言 这是一条规则 但如果不显式声明变量就不可能实现相同的结果auto 放弃显式的a
  • Windows 窗体中的切换开关控件

    我正在设计一个拨动开关控制使用CheckBox 但目前我的控件只能画一个圆圈 如何绘制如下图所示的圆形形状 以及如何根据控件的值更改圆圈的位置以表示选中和未选中的状态 如下图所示 这是我的代码 public class MyCheckBox
  • JQuery、ASCX 和 webmethods 似乎不起作用

    我有一个级联下拉列表 其中 3 个 类型 类别和子类别 首先类型负载 然后选择类型 类别负载以及选择类别 子类别负载 我还有 2 个按钮 添加类别 和 添加子类别 单击这些按钮后 我调用 JQuery 模态表单来添加它们 我在代码后面使用
  • 进入嵌入式[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 c11 标准和 clang 来使用 strcpy_s

    我正在运行 OS X Sierra 并尝试编译一个使用的 c 程序strcpy s 但是我安装的 clang 编译器使用的是 c99 标准 但是据我读到的 https embeddedgurus com barr code 2017 08
  • 忽略父进程中的信号

    我正在尝试实现一个 shell 程序 我希望 shell 程序忽略 SIG INT ctrl c 但在我的程序中 子进程也会忽略 SIG INT 信号 但它不应该这样做 因为 exec 应该将子进程带到另一个程序 并且该程序默认情况下应该处
  • C++ 中的反向迭代器和负跨步迭代器,在开始之前使用一个作为哨兵

    In 查看 C 反向迭代器的另一种方式 https devblogs microsoft com oldnewthing 20211112 00 p 105908雷蒙德 陈写道 C 语言的一个怪癖 你可以拥有一个指针 集合的 已过终点 但不
  • ASP.NET MVC 数据注释属性 Range 从另一个属性值设置

    您好 我的 Asp net MVc 模型中有以下内容 测试模型 cs public class TestModel public double OpeningAmount get set Required ErrorMessage Requ
  • 隐式转换和编译器的不同行为

    Motivated by this question https stackoverflow com q 51972738 5800831 I created the following code struct X X int struct
  • 如何将8字节的十六进制数输入到char数组中?

    我想生成以以下开头的十六进制数字序列07060504003020100 下一个数字是0f0e0d0c0b0a0908等等按这个顺序 当我使用unsigned long long int并输出数据的前4位 这意味着0被截断 它打印706050
  • 如何声明返回相同类型的 Func Delegate 的 Func Delegate?

    我想编写一个方法 该方法可以完成一些工作 并最终返回另一个与原始方法具有相同签名的方法 这个想法是根据前一个字节值顺序处理字节流 而不进行递归 通过这样调用它 MyDelegate executeMethod handleFirstByte
  • 从 ASP.NET Web API 返回 HTML

    如何从 ASP NET MVC Web API 控制器返回 HTML 我尝试了下面的代码 但由于未定义 Response Write 而出现编译错误 public class MyController ApiController HttpP
  • 在另一个类中使用一个类对象?

    我正在用 c 制作应用程序 在该应用程序中 我有一个类DataCapture cs 在同一个应用程序中 我有另一个类Listner cs 在 Listner cs 类中 我想使用以下对象DataCapture cs不创建新对象DataCap
  • ld: 无法对非 PE 输出文件执行 PE 操作错误

    我是操作系统编程的新手 我正在读一本书 其中给出了一个简单的内核示例 如下所示 main char video memory 0xb8000 video memory X 为了编译这个名为 kernel c 的文件 我在 Windows 7
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 使用 System.Windows.Forms.Timer.Start()/Stop() 与 Enabled = true/false

    假设我们在 Net 应用程序中使用 System Windows Forms Timer 在计时器上使用 Start 和 Stop 方法与使用 Enabled 属性之间有什么有意义的区别吗 例如 如果我们希望在进行某些处理时暂停计时器 我们
  • 编写一个转储屏幕像素的 RDP 客户端

    我想在中实现 RDP 客户端C 它能够获取屏幕所有像素的颜色值并将它们转储到文件中 我知道这在概念上与 RDP 的工作方式不同 但我的应用程序需要它 我正在尝试利用freerdp https github com FreeRDP FreeR
  • 阅读《Effective、MoreEffective 和Effective Modern C++(和 STL)》的首选顺序是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 据我所知 More effective C 是 Effective C 的扩展 而 Effective Modern C 则专注于 C 11 和

随机推荐

  • 如何使用 XCUITest 测试 UIImageView 是否包含具有特定名称的图像?

    我有一个 collectionView 它有一堆单元格 每个单元格中包含一个 UIImageView 我想测试每个单元格中 imageView 的图像是否与正确的图像名称匹配 在生产代码中 我向 UIImageView 示例添加了一个辅助功
  • 在ios swift中将firebase数据添加到数组中

    我在从 firebase 数据库获取数据并将其添加到数组中时遇到问题 该方法的打印输出获取新报价显示数组为空 但屏幕截图显示标签已在获取新报价方法 怎么会发生这种事 事件中是否存在延迟获取新报价导致这种情况的方法 此外 标签是如何随着第四次
  • 在Python中从json中获取多个键

    我的文件中有以下 json 结构 Date timevalue Org b4256282 Referer somevalue Date timevalue Org b4257482 Referer somevalue Date timeva
  • 如何在同一 Play 控制台商店列表中分发 Android 手机+wearOS 项目

    我有一个手机项目 以及一个手表 wearOS 项目 90 的代码在两个项目之间共享 我想将它们打包并分发到同一个商品详情中 注意 所有共享代码都存在于公共库模块中 我尝试将手表项目作为模块添加到我现有的手机项目中 但是在生成要发布的应用程序
  • 如何将 UIPageControl 与 iCarousel 一起使用?

    我在 icarousel 中有一些图像 约20张图片 我想在一页上放 5 张图片 图像像素或图像位置没有问题 如何在没有ScrollView的情况下使用uipagecontrol 例如 能够使用一些委托方法 等等 carousel type
  • Node.js:确定修改时的文件大小

    我正在 Node js 中查看一个文件 并希望在每次更改时获取该文件的大小 如何做到这一点fs watchFile 这就是我目前正在做的事情 fs watchFile file function curr prev determine fi
  • AttributeError:模块“pyparsing”没有属性“downcaseTokens”rasa

    我在使用 rasa 时遇到问题 因为出现以下错误 我无法跑步或训练或做任何事情 回溯 最近一次调用最后一次 文件 c users dell anaconda3 envs rasanew lib runpy py 第 193 行 位于 run
  • 将子控制器添加到表视图单元格时不会调用 viewWillAppear

    当我将子视图控制器添加到表视图单元格时 它看起来像视图将出现对于子视图控制器不被调用 仅查看是否出现 表视图控制器方法 override func tableView tableView UITableView cellForRowAtIn
  • 删除具有相似前缀的重复行

    我需要删除文件中具有重复前缀的类似行并保留唯一的行 由此 abc def ghi abc def ghi jkl one abc def ghi jkl two 123 456 123 456 789 xyz to this abc def
  • 执行动态加载的JS文件

    我理解JS是单线程 同步执行的 因此 当我将文件添加到浏览器头标记时 该文件一遇到就会执行 然后它转到下一个脚本标记并执行该文件 我的问题是当我将 js 文件动态添加到 HTML head 标记时 浏览器如何执行该文件 是不是像当前执行的地
  • 如何用CSS将矩形图像“裁剪”成正方形?

    我知道用 CSS 实际修改图像是不可能的 这就是为什么我将裁剪放在引号中 我想做的是拍摄矩形图像并使用 CSS 使它们显示为正方形而不扭曲图像 我基本上想把这个 进入这个 没有包装器的纯 CSS 解决方案div或其他无用的代码 img ob
  • 在启动时设置默认的 matlab 路径

    我的团队正在尝试标准化我们的 Matlab 路径 以便每个人都有相同的路径 我有一个我们都应该拥有的默认 matlab 路径列表 因此 我们希望有一个在 matlab 打开时运行的脚本 以确保我们的路径设置为默认的 matlab 路径 因此
  • 如何使用 PHP 从 HTML 代码中删除多余的
    标签?

    我正在用 PHP 解析一些凌乱的 HTML 代码 其中有一些冗余标签 我想清理一下它们 例如 br br br br 我如何使用 preg replace 替换类似的东西 br br 换行符 空格以及它们之间的差异 br br and br
  • 无法施展通用套装?

    我今天遇到一个有趣的问题 考虑下面的代码 public static class Parent public static class Child extends Parent Set
  • 如何用 R 中的特定值替换 NA 值?

    我有一个时间序列数据框 但该数据包含 NA 如下所示 KQ11 Open KQ11 High KQ11 Low KQ11 Close KQ11 Volume KQ11 Adjusted 2017 04 05 627 89 630 17 62
  • 使用 AngularFire 中的记录进行基本用户身份验证

    在花了几天时间尝试不同的 各种推荐的方法来做到这一点之后 我找到了我认为最简单和最有希望的方法 也感谢这个问题的好心人 获取 Firebase AngularFire 中项目的索引 ID 当前设置 用户可以使用电子邮件和社交网络登录 因此当
  • turtle.done() 在 Spyder 中不起作用

    这个简单的 Python 脚本 import turtle bob turtle Turtle bob forward 50 turtle done 使用 Spyder 运行时会出现错误 第一次运行按预期工作 但之后 IPython 控制台
  • BadFilterError:过滤器无效:每个查询只能有一个属性具有不等式过滤器(<=、>=、<、>)

    我正在尝试对两个不同的属性应用过滤器 但 GAE 不允许我这样做 那么解决方案是什么 这是代码片段 if searchParentX que filter parentX gt searchParentX filter parentX lt
  • TWIG - 在不同模板中包含变量

    我想在不同的模板中包含相同的变量 vars catchphrase twig set catchphrase size if var tile catchphrase length lt 4 set catchphrase size siz
  • 各种符号(*、&等)与参数组合有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 我知道这对你们许多人来说可能是一个非常基本的问题 但尽管我尽了最大的努力 但我确实很难找到一个好的 彻底的解释 我确信答案就在那里 所以我的搜索词一定很糟糕 在 C 中 使用各种符号及其组合来标记参数