指针参数是否需要通过引用传递

2024-04-14

我有一个非常简单的链表。我的addNode(Node* &list, int value)如果我通过引用传递列表,函数只会将新节点添加到我的链接列表中。如果我按值传递列表,则不会:addNode(Node* list, int value).

我知道什么pass by value and pass by reference是,但我认为指针函数参数本质上是通过引用传递,因为指针指向内存位置(是对实例的引用)。因此我认为&是多余的不是吗?还是我错了?

class Node
{
public:
    Node* next;
    Node* prev;
    int   value;

    Node(int nValue=0) : next(NULL), prev(NULL), value(nValue) { }
    ~Node() { cout << "Deleting " << value << endl; }
};

// Why do I need to pass by reference 'list'?
// If I dont then the variable 'linkedList' (in main) doesn't have nodes added to it
void addNode(Node* &list, int value)
{
    Node* newNode = new Node(value);
    newNode->prev = list;
    list->next    = newNode;
    list          = newNode;
}

int main()
{
    Node* linkedList = new Node(1);
    addNode(linkedList, 2);

    // TODO: release memory

    system("PAUSE");
    return 0;
}

这取决于。如果您更改函数内的指针,那么您应该通过引用传递指针。另一方面,如果您不更改函数内的指针,则没有理由添加另一级间接并按引用传递。

不,指针不会自动通过引用传递,它们像任何其他参数一样通过值传递。如果不通过引用传递,则指针将被复制,并且您只能对副本进行操作,而不能对原始指针进行操作。

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

指针参数是否需要通过引用传递 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐

  • 使用Android GPS检测并与其他手机连接

    所以我昨天问了类似的问题 并且确实收到了我的问题的答案 但是我真的认为我问得不正确 因此没有收到我需要的确切信息 我正在寻找 API 一些开源代码 甚至只是其他人在 Android 上实现这一目标的方法 我正在制作一个应用程序 需要查找指定
  • 为什么Python中没有len(file)?

    我对 Python 并不陌生 但我仍然很难理解是什么让某些东西变得 Pythonic 反之亦然 如果这是一个愚蠢的问题 请原谅我 但是为什么我不能通过执行 len file 来获取文件的大小 file len 甚至没有实现 所以它不像其他东
  • 过度使用 If else 语句

    我有一个查询 那就是我使用了一种方法 但是我很多次使用了 If Else 不是它变得非常含糊 请建议我也可以使用其他条件循环吗 下面是我的代码 if cardType AARP CARD TYPE userResponse messageB
  • HBase:创建多个表或包含多个列的单个表?

    什么时候创建多个表而不是创建具有大量列的单个表才有意义 据我了解 表通常只有几个列族 1 2 每个列族可以支持 1000 多个列 当 HBase 似乎在单个表中可能存在大量列时表现良好时 什么时候创建单独的表才有意义 在回答问题本身之前 让
  • SQL查询求和

    我有两张桌子 Unit Unit id Unit name Unit cost 成分 Component id Component name Unit id 它们通过以下方式连接在一起Unit id Unit id 1有名字Unit 1 N
  • DurandalJS 路由行为

    我拥有的 试图了解发生了什么以及如何控制它 我对尚未经过身份验证的用户有一个 公共 视图 对经过身份验证的用户有一个 主页 视图 这是我的路线配置 app start then function Replace viewmodels in
  • Golang 函数指针作为结构的一部分

    我有以下代码 type FWriter struct WriteF func p byte n int err error func self FWriter Write p byte n int err error return self
  • 选择特定时间范围内 datetime64[ns] 类型的观察

    我有一个熊猫数据框 dfnew 其中一列 时间戳 是datetime64 ns 类型 现在我想查看特定时间范围内有多少观测值 比如说 10 00 00 到 12 00 00 dfnew timestamp dfnew timestamp a
  • 英特尔 SGX 开发者许可和开源软件

    是否可以获得许可的开发人员证书 用于在生产模式下签署经过安全审查 社区开发的开源 SGX 软件二进制文件 并将其发布到 apt 或 rpm 等开源存储库上 我刚刚询问了Intel SGX团队 他们说只有经过验证的供应商才能获得证书并在生产模
  • socket.io - 发送对象必须使用 JSON

    我在前端有一个对象 我想将它广播到所有连接的客户端 我可以按照我定义的方式将其作为纯粹的对象发送吗 或者我总是必须在发送之前将其字符串化为 JSON 对象 我的对象 var myBox x 400 y 700 w 231 h 199 c r
  • 无法使用 git 扩展加载我的私钥

    过去2小时我一直在努力 我使用 xp dev 作为 git 存储库提供程序 因为我已经付款并且那里有 svn 存储库 我已经给了 xp dev 我的公钥 但是当克隆我的仓库时 我被拒绝了 C Program Files x86 Git bi
  • Angular 4:如何观察对象的变化?

    ETA 我知道有多种方式可以观看我的form进行更改 这不是我想做的 正如标题所示 我问的是如何监视object 下面显示的应用程序仅用于说明目的 请回答我提出的问题 谢谢 我有这个简单的应用程序 import Component OnIn
  • 使用shared_ptr的例子?

    你好 我今天问了一个关于如何在同一个向量数组中插入不同类型的对象 https stackoverflow com questions 3475030 different types of objects in the same vector
  • XML 模式:扩展 xsd:choice 以便创建选择的联合(而不是序列)

    我有以下 XML 架构
  • Visual Studio Code 自定义缩进样式

    无论出于何种原因 我讨厌它 但事实就是如此 我公司的标准风格是将大括号缩进到与它们包含的代码相同的水平 如下所示 public static string StringName get return string value 这在 Visu
  • 如何在 Django 中使用 UNION + 添加假列

    我正在尝试在 django ORM 中转换以下查询 SELECT MONTH date AS Month col1 col2 col3 col3 SUM col4 col4 SUM col5 col5 FROM table1 WHERE d
  • 我应该检查构造函数参数的类型(以及其他地方)吗?

    Python 不鼓励检查类型 但在许多情况下这可能很有用 检查构造函数参数 例如检查敌人的布尔值 字符串 字典等 如果我不这样做并将对象的成员设置为参数 稍后会导致问题 检查函数参数 在属性中 如果有人设置了错误的值或不同的类型 我应该快速
  • 读取多个 CSV 文件

    需要提取大量信息 即 file1 10948 Book Type1 file2 SHA512 0 10948 file3 0 10948 SHA512 c3884fbd7fc122b5273262b7a0398e63 我想把它变成类似的东西
  • C语言中什么情况下需要释放内存?

    我可能被误导了 但据我所知 操作系统会在程序退出或崩溃后清理内存 如果是这样 在程序结束时释放内存有多大用处 我知道 如果程序正在运行并且忽略释放 内存可能会变得 满 但是如果程序已经要结束并且操作系统释放了程序使用的所有内存 那么手动释放
  • 指针参数是否需要通过引用传递

    我有一个非常简单的链表 我的addNode Node list int value 如果我通过引用传递列表 函数只会将新节点添加到我的链接列表中 如果我按值传递列表 则不会 addNode Node list int value 我知道什么