问题标签 [pass-by-pointer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
734 浏览

arrays - 在 Common Lisp 中按引用(而不是按值)传递子数组

假设我有一个数组——我将调用它*my-array*——它看起来像这样:

我希望在子数组上应用一些函数 f

我很想能够写作

wheresubarray作为参数:

  • 原始数组
  • 一个 2 元素列表,起点和终点在第一维
  • 另一个 2 元素列表,起点和终点在第二维
  • 等等

我正在寻找某种方法f 通过引用(或通过指针?)而不是通过值将子数组作为参数传递给函数。

(解决这个问题的愚蠢方法是编写一个函数,该函数创建(在这种特定情况下)一个 2*2 数组并循环 i 和 j 从原始数组复制值。但是,如果您正在处理相对较大的数组,则此将是相当昂贵的。)

我发现存在一个cl-slice包,但我不知道它是复制值还是通过引用访问数据。

0 投票
5 回答
1947 浏览

c++ - 在 C++ 中使用指针总是不好的吗?

我被告知要避免在 C++ 中使用指针。但是在我尝试编写的代码中,我似乎无法避免它们,或者我可能错过了其他出色的 C++ 功能。

我希望创建一个包含另一个类 (class2) 作为数据成员的类 (class1)。然后我希望 class2 了解 class1 并能够与之通信。

我可以引用 class1 作为 class2 中的成员,但这意味着我需要提供对 class1 的引用作为 class2 的构造函数中的参数,并使用我不想要的初始化列表。我试图在不需要构造函数的情况下做到这一点。

我希望 class2 有一个名为 Initialise 的成员函数,它可以接受对 class1 的引用,但如果不使用指针,这似乎是不可能的。人们会在这里推荐什么?提前致谢。

代码完全简化只是为了了解主要思想:

0 投票
1 回答
89 浏览

ios - inout 参数的地址不同

我有三个类 A、B 和 C。A 有一个名为 rA 的资源。我想要实现的是所有这些实例都引用了完全相同的资源。

因此,用 Swift 术语具体来说:

A 类有一个名为 foo 的属性:

B 类有一个名为 foo 的属性,它作为 inout 参数传递给初始化程序:

C类类似于B类

如果我foo从 A 类转到 B 类(或 C),地址怎么会改变?

在 AI 中,它会将其传递给 B(或 C),如下所示:

当我foo在 A 中初始化后打印地址时,它给我的地址与在 B 中分配后的地址不同。

任何想法为什么会这样?

0 投票
2 回答
1501 浏览

c++ - 返回一个对象:值、指针和引用

我知道这可能已经被问过了,并且我已经查看了其他答案,但我仍然无法完全理解。我想了解以下两个代码之间的区别:

现在假设我在 main 中调用这些函数:

  1. 如果我明白这一点,在第一种情况下,在函数范围内创建的对象将具有自动存储功能,即当您退出函数范围时,其内存块将被释放。此外,在释放此类内存之前,返回的对象将被复制到我创建的“what”变量中。所以只会存在一个对象的副本。我对么?

    1a。如果我是正确的,为什么需要 RVO(返回值优化)?

  2. 在第二种情况下,对象将通过动态存储分配,即它甚至存在于函数范围之外。所以我需要使用delete它。该函数返回一个指向此类对象的指针,因此这次没有复制,执行 delete who 将释放先前分配的内存。我(希望)是正确的吗?

  3. 我也知道我可以做这样的事情:

    然后主要是:

    通过这种方式,我只是告诉“谁”与在函数中创建的对象是同一个对象。不过,现在我们已经超出了函数范围,因此该对象不一定不再存在。所以我认为应该避免这种情况以避免麻烦,对吗?(同样适用于

    这将创建一个指向局部变量的指针)。

奖励问题:我认为到目前为止所说的任何内容在返回时也是正确vector<T>的(例如,vector<double>),尽管我错过了一些片段。我知道一个向量是在堆栈中分配的,而它包含的东西在堆中,但是使用vector<T>::clear()足以清除这样的内存。现在我想遵循第一个过程(即按值返回一个向量):当向量将被复制时,它包含的对象也将被复制;但退出函数范围会破坏第一个对象。现在我拥有了无处包含的原始对象,因为它们的向量已被破坏,并且我无法删除仍在堆中的此类对象。或者也许 aclear()是自动执行的?

我知道我可能会在这些主题(特别是在矢量部分)中存在一些误解,所以我希望你能帮助我澄清它们。

0 投票
2 回答
249 浏览

c - 为什么在这种情况下我必须将指针传递给指针

这个问题是建立在我之前的问题之上的。

我有这个结构。它使用 SDL2:

这没有用。答案建议,我*&window改为用作函数参数,效果很好。*&window我将to重写**window为:

它也有效。但我仍然不明白为什么第一个版本不起作用。我查看了SDL_Window 的实现细节,typedef将它放入普通命名空间只是一个正常的结构。SDL_CreateWindow返回SDL_Surface *.

为了描绘我的困境,我编写了这个简单的程序:

53这就像预期的那样打印,而我不必使用指向指针语义的指针。我的实现与 SDL2 的实现有什么区别。这不是 SDL2 问题,因为回答我上一个问题的人可以在不了解 SDL2 的情况下回答这个问题,所以我似乎错过了一些实现细节。希望有人能启发我。

0 投票
1 回答
143 浏览

c++ - 在这个例子中使用 passByRefrence 和 passByAddress 有什么区别。C++

正如您在下面我将要提供的示例中看到的那样,我同时使用通过引用和通过地址...

所以在这里我真的不明白使用 passbyaddress 和 passbyreference 的区别..虽然我理解这两者和 Pass By Value 之间的区别(因为按值传递传递变量的副本而不是内存地址),我不明白这两者有什么区别。很多人只是说“使用传递引用更好”,或者“一直使用传递引用,除非你必须使用传递地址”。但我想知道真正的区别,所以我可以决定哪个在我以后的项目中使用。

谢谢你。

0 投票
2 回答
2831 浏览

c - 使用带有指向双指针的指针的 scanf()

我觉得我已经尝试了我所知道的每一种组合来让它发挥作用,但无法弄清楚。我怎样才能scanf()把一个int**作为指针传递给一个函数?我尝试搜索但找不到这个,如果它是重复的,请告诉我,我会删除。它开始运行,并在输入一些值后出现段错误。

这是我的代码,我认为它弄乱了函数的scanf()行:setMatrix()

0 投票
1 回答
55 浏览

c++ - 当我离开该方法时,来自静态向量的数据保持不变

这是我在学习 C++ 时想到的一个银行项目,我在学习继承和指针时一直在添加它。用户是银行出纳员,可以创建新客户或处理现有客户的交易。

A CustomerhasSavingsCheckingclasses 作为私有字段,继承自Account. 该类Bank从其私有static vector<Customer>字段添加/获取客户。

出乎意料的结果是,在“process_transaction”方法中,我可以从向量中获取客户并从其账户中存款/取款,但是一旦我离开该方法并返回它,账户数据从我初始化它们时起并没有改变.

需要帮忙。这是对客户问题的参考吗?我什么时候应该通过引用或指针返回?

这是代码。在驱动程序类中,我有一个创建客户的方法

我在驱动程序类中有另一种方法来处理客户。一旦我离开此方法,客户的帐户就不会改变,但会以其他方式工作。

银行类。

Bank.h

0 投票
1 回答
2882 浏览

ruby - 如何在 Ruby 中通过引用传递?

目前我正在Watcher用 Ruby 开发一个类,除其他外,它能够找到切换信号的周期持续时间。这通常相当简单,但我面临的一个问题是显然 Ruby 按值传递所有参数。在网上研究时,我发现许多关于“按值传递”和“按引用传递”实际上是什么的不同讨论,但没有实际的“如何”。来自 C/C++ 背景,对我来说,这是编程/脚本语言的重要组成部分。

我编写的课程的相关部分如下所示。Watcher::watchToggling() 方法是我遇到问题的方法。作为一个参数,aVariable应该是对我测量周期持续时间的值的参考。

ruby 有什么方法可以通过引用传递吗?如果没有,是否有替代方案可以解决这个问题?

0 投票
2 回答
488 浏览

c - 将结构从 main() 传递给工作函数时的段错误

我正在尝试用 C 编写一个简单的游戏,但我得到了一个 SEGFAULT,但不知道为什么!

这是程序的代码:

我尝试使用 gdb 进行调试,但结果并没有让我走得太远: