2013-02-13 123 views
3

学习C++的基础知识,并试图将我的头包裹在指针以及何时使用它们。从Javascript-Actionscript背景来看,我想不出任何类似的东西。Actionscript-Javascript中的C++指针的概念

任何人都可以提示在Javascript或ActionScript 3中的指针的任何等价物,也可以使用它们吗?

回答

4

快速简单的回答是,没有什么类似于javascript或actionscript中的指针,但我可能会为你画出一些细腻的明喻。

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

但是每一种编程语言都需要管理内存 - 它们必须让你创建(新)变量,访问这些变量,并存储对它们的引用。功能也是如此。

看看你做的一些事情,并用指针思维来思考它们。

  • 当您将变量设置为命名函数时,虚拟机正在内存中查找函数,并将该变量设置为指向该内存。 (在C中,这称为函数指针,C++也使用它)
  • 当您设置一个变量等于一个匿名函数时,您的虚拟机会在内存中某处创建函数,将该变量设置为指向该区域在它的记忆中,并让你参考它。
  • 当您调用new时,您正在创建一个新的参考。虚拟机再一次在内存中创建一个点,并为您提供一种访问方式。
  • 当你将一个对象传递给一个函数时,你不会传递整个对象,而是传递一个对象的引用。 VM使用你的变量来告诉函数使用哪部分内存以及它应该如何表现。

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

1

中没有类似的概念。

C++超越了C语言的指针概念。基本上C/C++指针持有具体的内存地址类型的实例,但C++增加了类类型的多态解析。

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

C++引用(请参见&类型说明符)基本相同,但必须将初始化为引用有效类型实例的有效内存地址。相比之下,指针还可以包含NULL值,表示没有引用有效的类型实例。

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

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

0

考虑下面的例子:

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

随着对象的JavaScript行为类似指针做。

1

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

通常,当您使用的对象的生命周期允许它转义创建上下文时,您使用指针。即使这样,最好的做法是将指针包装在另一个对象中,并在适当的时候自动删除指针。

如果您将一些研究放入C++参考中,并且C++将默默复制一个对象(复制构造函数等),则引用的用处将变得明显。然后当你意识到引用有一些使用限制时,你只剩下指针。 :)

希望能让你开始!

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”在内存中,而指针catString只知道该字符串的位置,并且指向该内存地址字符串中的第一个字母。这也是为什么字符串需要空插头,注意地址6,所以当打印时,程序知道何时停止打印字符。 char *str;是更多的C风格的读取,字符数组,这相当于C++中的string str;,它更友好!

1

通过考虑一个指针(或引用),一个值hold the address of the actual object;
在AS3到一个亚类为“Object”的任何参考是一个指针:

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

任何修改到对象“指示器”实际修改“a”和因此“指示器”是一个指针/引用(持有地址)为'a',即使传递给函数作为参数:参数是一个指针(通过引用而不是值传递)。
但是,原始类型不是'Object'的子类,而是'Point',它总是按值(复制)传递给新的变量或参数;原始类型包括int,uint,Boolean,Number,String。
顺便说一下,C++ pointers are a special kind of 'reference' implementation.

0

这是另一个关于它的问题。

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

如果人A将东西放入抽屉中,然后在稍后时间将纸片给人B,则人B仍然可以找到人A放置在那里的任何东西。

依此类推。