学习C++的基础知识,并试图将我的头包裹在指针以及何时使用它们。从Javascript-Actionscript背景来看,我想不出任何类似的东西。Actionscript-Javascript中的C++指针的概念
任何人都可以提示在Javascript或ActionScript 3中的指针的任何等价物,也可以使用它们吗?
学习C++的基础知识,并试图将我的头包裹在指针以及何时使用它们。从Javascript-Actionscript背景来看,我想不出任何类似的东西。Actionscript-Javascript中的C++指针的概念
任何人都可以提示在Javascript或ActionScript 3中的指针的任何等价物,也可以使用它们吗?
快速简单的回答是,没有什么类似于javascript或actionscript中的指针,但我可能会为你画出一些细腻的明喻。
所有的语言都是通过指针实现给你的功能,但是大多数现代语言都将它们隐藏在程序员之外。 C/C++通过暴露它们并要求您使用它们,为您提供了许多强大的功能;大多数其他语言通过隐藏它们来防止程序员伤害自己。对自己的记忆管理负责可能是危险的。此外,请记住,C和C++是比JavaScript,ActionScript甚至Java或C#更早的语言 - 指针语法对于那些“原始”时间是必需的。 (C在内存管理中非常接近汇编代码,而C++则直接来自C)。
但是每一种编程语言都需要管理内存 - 它们必须让你创建(新)变量,访问这些变量,并存储对它们的引用。功能也是如此。
看看你做的一些事情,并用指针思维来思考它们。
如果您开始在C/C++中进行大量编程,您会发现在几乎所有的事情中都使用指针(和引用,这是一个相关的概念)。一旦你习惯了它,你会发现你一直在使用类似的概念 - 你不必明确地知道你在做什么。你会更清楚每种编程语言与它的内存有什么关系 - 无论是隐式还是显式。
javascript或actionscript-3中没有类似的概念。
C++超越了C语言的指针概念。基本上C/C++指针持有具体的内存地址点类型的实例,但C++增加了类类型的多态解析。
在C++中传递(作为函数参数)或存储(作为变量,类属性)对类型实例的引用的首选机制是(uummm)引用或值。在所有情况下,这可能都是不可能的或想要的。
C++引用(请参见&
类型说明符)基本相同,但必须将初始化为引用有效类型实例的有效内存地址。相比之下,指针还可以包含NULL
值,表示没有引用有效的类型实例。
此外,它完全不鼓励在C++中使用原始指针类型(类似C)。标准库为实例引用的特定语义用例情况提供了几个指针,如代理(智能指针类型),用于处理生命周期管理a.s.o. (回想起C++没有内在的垃圾收集机制)。
在Google和SO上有关于此主题的更多资源。
考虑下面的例子:
a = {a:1, b:2};
b = a;
b.a = 4;
console.log(a.a); // outputs 4
随着对象的JavaScript行为类似指针做。
没有很好的1对1映射。指针隐藏在其他语言中,因为虽然功能非常强大,但也容易导致应用程序崩溃。
通常,当您使用的对象的生命周期允许它转义创建上下文时,您使用指针。即使这样,最好的做法是将指针包装在另一个对象中,并在适当的时候自动删除指针。
如果您将一些研究放入C++参考中,并且C++将默默复制一个对象(复制构造函数等),则引用的用处将变得明显。然后当你意识到引用有一些使用限制时,你只剩下指针。 :)
希望能让你开始!
我喜欢从概念上考虑指针,就像有两列和无限多行的巨型表。在第一列中,我们有地址的内存,并在第二,我们有存储在该地址它可能看起来像值:
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;
,它更友好!
通过考虑一个指针(或引用),一个值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.
这是另一个关于它的问题。
将指针想象成手中的纸条,告诉您要在厨房中的特定抽屉中查看。你可以把纸条传给住在房子里的任何人,如果他们按照纸条上的指示,他们都会打开同一个抽屉。
如果人A将东西放入抽屉中,然后在稍后时间将纸片给人B,则人B仍然可以找到人A放置在那里的任何东西。
依此类推。