3

学习 C++ 的基础知识,并试图围绕指针以及何时使用它们。来自 Javascript-Actionscript 背景我想不出任何类似的东西。

任何人都可以建议任何与 Javascript 或 Actionscript 3 中的指针等效的方法,以及何时可以使用它们?

4

7 回答 7

4

快速而简单的答案是,没有什么类似于 javascript 或 actionscript 中的指针,但我也许可以为您画一些微不足道的明喻。

所有语言都实现了通过指针提供给您的功能,但大多数现代语言对程序员隐藏了它们。C/C++ 通过暴露它们并要求你使用它们给你很大的力量;大多数其他语言通过隐藏它们来防止程序员伤害自己。负责自己的内存管理可能很危险。另外,请记住,C 和 C++ 是比 JavaScript、ActionScript 甚至 Java 或 C# 更早的语言——在那些“原始”时代,指针语法是必要的。(C 在内存管理上非常接近汇编代码,而 C++ 直接来自 C。)

但是每种编程语言仍然必须管理内存——它们必须让您创建(新)变量、访问这些变量并存储对它们的引用。函数也是如此。

看看你所做的一些事情,并以指针的心态思考它们。

  • 当您将变量设置为与命名函数相等时,您的虚拟机将在内存中找到该函数,并将变量设置为指向该内存。(在 C 中,这称为函数指针。C++ 也使用它。)
  • 当您将变量设置为匿名函数时,您的虚拟机会在内存中的某处创建该函数,将变量设置为指向其内存中的该区域并让您引用它。
  • 当你调用 new 时,你正在创建一个新的引用。同样,虚拟机正在内存中创建一个点,并为您提供访问它的方法。
  • 当您将一个对象传递给一个函数时,您并没有传递整个对象,而是传递了对它的引用。VM 使用您的变量来告诉函数要使用的内存部分以及它的行为方式。

如果您开始使用 C/C++ 进行大量编程,您会发现几乎在您所做的所有事情中都使用指针(和引用,这是一个相关的概念)。一旦你习惯了它,你会发现你一直在使用类似的概念——你只是不必明确地意识到你在做什么。您将更加了解每种编程语言与其内存的关系——无论是隐式的还是显式的。

于 2013-02-13T20:21:01.020 回答
2

通过考虑指针(或引用),一个保存实际对象地址的值;
在 AS3 中,对“Object”子类的任何引用都是指针:

var a:Point = new Point(0, 0);
var pointer:Point;
pointer = a;

对对象“指针”的任何修改实际上都会修改“a”,因此“指针”是指向“a”的指针/引用(保存地址),即使作为参数传递给函数:参数是指针(通过引用传递而不是按价值)。
然而,与“Point”不同的“Object”子类的基元类型总是按值(复制)传递给新的变量或参数;原始类型包括 int、uint、Boolean、Number、String。
顺便说一句,C++ 指针是一种特殊的“引用”实现。

于 2013-02-13T20:27:07.520 回答
1

中没有类似的概念。

C++ 取代了 C 语言中的指针概念。基本上 C/C++ 指针保存指向类型实例的具体内存地址,但 C++ 为类类型添加了多态解析。

在 C++ 中传递(作为函数参数)或存储(作为变量、类属性)引用到类型实例的首选机制是(uummm)引用或值。这可能不是在所有情况下都是可能的或想要的。

C++ 引用(参见&类型说明符)基本相同,但必须初始化为引用有效类型实例的有效内存地址。相反,指针也可以保存一个NULL值,表明没有引用有效的类型实例。

此外,完全不鼓励在 C++ 中使用原始指针类型(类似 C)。标准库为实例引用的特定语义用例情况提供了几个类似代理(智能指针类型)的指针,解决了生命周期管理问题(回想一下,C++ 没有内在的垃圾收集机制)。

在 Google 和 SO 上有很多关于这个主题的更多资源。

于 2013-02-13T19:50:54.000 回答
1

没有一个好的一对一映射。指针在其他语言中是隐藏的,因为虽然非常强大,但也容易导致应用程序崩溃。

通常,当您使用的对象的生命周期允许它逃避您的创建上下文时,您使用指针。即使这样,最佳实践还是将指针包装在另一个对象中,该对象将在适当时自动删除该指针。

如果您对 C++ 引用进行一些研究,并且当 C++ 将默默地复制对象(复制构造函数等)时,引用的用处将变得显而易见。然后,当您意识到引用有一些使用限制时,您就会得到指针。:)

希望这能让你开始!

于 2013-02-13T20:00:33.650 回答
0

考虑以下示例:

 a = {a:1, b:2};
 b = a;
 b.a = 4;
 console.log(a.a); // outputs 4

对于对象,JavaScript 的行为类似于指针。

于 2013-02-13T19:57:17.530 回答
0

我喜欢在概念上将指针想象成一个有两列和无限行数的巨型表。在第一列中,我们有内存地址,在第二列中,我们有存储在该地址的值,它可能看起来像:

char *catString = "cat"; //C picked free space at address 3 to hold this string

 Address     Value
    0         23
    1         'r'
    2         12.2
    3         'c'
    4         'a'
    5         't'
    6         '/0'
   ...        ...

catString 实际上保存值 3,而不是“cat”。字符串“cat”在内存中,而指针 catString 只知道字符串在哪里,并指向该内存地址处字符串中的第一个字母。这也是为什么字符串需要一个空插件,注意地址 6,所以在打印时,程序知道何时停止打印字符。 char *str;是更多的 C 风格,它是一个字符数组,这相当于string str;在 C++ 中,它对字符串更加友好!

于 2013-02-13T20:16:20.133 回答
0

这是另一种看法。

把指针想象成你手中的一张纸条,它告诉你去厨房里的特定抽屉里找。你可以把这张纸条传给住在房子里的任何人,如果他们按照纸条上的指示,他们都会打开同一个抽屉。

如果 A 人在抽屉里放了东西,然后在稍后将纸条交给 B 人,B 人仍然可以找到 A 人放在那里的任何东西。

等等。

于 2013-02-14T21:07:08.107 回答