我开始向后学习编码:首先是高级类(class)。这显然会遗漏一些我应该明确知道的基本概念,并且当我尝试学习低级语言时,这使我感到困惑。
我已经尝试了很多次来理解指针,但是解释很快就笼罩了我,这通常是因为所有示例代码都使用了使用指针的语言,而我对此一无所知,因此我开始旋转。
我最(而且非常擅长)使用Java语言。
您将如何解释指向像我这样可悲的Javascript开发人员的指针?有人可以给我提供一个实际的,现实的例子吗?
甚至甚至可以演示,如果Javascript具有指针,您可以执行x
,并且由于y
,指针与原始变量不同。
最佳答案
这是从基本原理中得出一个完整的答案的尝试。
指针是类型系统的一部分,该类型系统允许实现引用语义。就是这样。我们假设我们的语言有一个类型系统,每个变量都具有某种类型。 C是一个很好的例子,但是许多语言都是这样工作的。因此,我们可以有一堆变量:
int a = 10;
int b = 25;
此外,我们假设函数参数总是从调用者作用域复制到函数作用域。 (尽管许多类型的真实语言也是如此,但是当类型系统被用户“隐藏”时(例如在Java中),细节可能很快变得微妙)。因此,让我们有一个功能:
void foo(int x, int y);
调用
foo(a, b)
时,将变量a
和b
复制到与形式参数相对应的局部变量x
和y
中,并且这些副本在函数范围内可见。该函数对x
和y
进行的任何操作均不会影响调用站点上的a
和b
变量。整个函数调用对调用者是不透明的。现在,让我们继续前进到指针。对于每种对象类型
T
而言,带有指针的语言都包含一个相关的类型T *
,即“指向T
的指针”类型。通过获取T *
类型的现有对象的地址来生成T
类型的值。因此,具有指针的语言还需要有一种产生指针的方式,即“获取某物的地址”。指针的目的是存储对象的地址。但这只是图片的一半。另一半是处理对象地址的方法。关注对象地址的主要原因是能够引用其地址正在存储的对象。该对象是通过第二个操作(适本地称为解引用)获得的,该操作在应用于指针时会生成被“指向”的对象。重要的是,我们没有对象的副本,但是我们得到了实际的对象。
在C语言中,address-of运算符的拼写为
&
,而解除引用运算符的拼写为*
。int * p = &a; // p stores the address of 'a'
*p = 12; // now a == 12
最终赋值的第一个操作数
*p
是对象a
本身。 a
和*p
都是同一个对象。现在为什么有用?因为我们可以将指针传递给函数,以允许函数在函数自身范围之外进行更改。指针允许间接访问,因此可以进行引用。您可以告诉函数“其他”。这是标准示例:
void swap(int * p, int * q)
{
int tmp = *p;
*p = *q;
*q = tmp;
}
我们可以通过为变量
swap
和a
提供这些变量的地址来告知它们b
和swap
这些变量的地址:swap(&a, &b);
这样,我们使用指针来实现ojit_code函数的引用语义。该函数可以引用其他地方的变量并可以对其进行修改。
因此,引用语义的基 native 制可以概括如下:
T a;
mangle_me(&a);
void mangle_me(T * p)
{
// use *p
}
引用语义对于编程的某些方面很重要,许多编程语言以某种方式提供它们。例如,C++为该语言添加了 native 引用支持,从而大大消除了对指针的需求。 Go使用显式指针,但有时有时会自动取消引用指针,从而提供了一些符号上的“便利”。 Java和Python在其类型系统中“隐藏”指针,例如从某种意义上说,变量的类型是指向对象类型的指针。在某些语言中,某些类型(如整数)是裸值类型,而其他类型(如列表和字典)是“包含隐藏指针”的引用类型。您的里程可能会有所不同。
关于pointers - 解释指向Javascript开发人员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24688567/