pointers - 解释指向Javascript开发人员的指针

标签 pointers

我开始向后学习编码:首先是高级类(class)。这显然会遗漏一些我应该明确知道的基本概念,并且当我尝试学习低级语言时,这使我感到困惑。
我已经尝试了很多次来理解指针,但是解释很快就笼罩了我,这通常是因为所有示例代码都使用了使用指针的语言,而我对此一无所知,因此我开始旋转。
我最(而且非常擅长)使用Java语言。
您将如何解释指向像我这样可悲的Javascript开发人员的指针?有人可以给我提供一个实际的,现实的例子吗?
甚至甚至可以演示,如果Javascript具有指针,您可以执行x,并且由于y,指针与原始变量不同。

最佳答案

这是从基本原理中得出一个完整的答案的尝试。

指针是类型系统的一部分,该类型系统允许实现引用语义。就是这样。我们假设我们的语言有一个类型系统,每个变量都具有某种类型。 C是一个很好的例子,但是许多语言都是这样工作的。因此,我们可以有一堆变量:

int a = 10;
int b = 25;

此外,我们假设函数参数总是从调用者作用域复制到函数作用域。 (尽管许多类型的真实语言也是如此,但是当类型系统被用户“隐藏”时(例如在Java中),细节可能很快变得微妙)。因此,让我们有一个功能:
void foo(int x, int y);

调用foo(a, b)时,将变量ab复制到与形式参数相对应的局部变量xy中,并且这些副本在函数范围内可见。该函数对xy进行的任何操作均不会影响调用站点上的ab变量。整个函数调用对调用者是不透明的。

现在,让我们继续前进到指针。对于每种对象类型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;
}

我们可以通过为变量swapa提供这些变量的地址来告知它们bswap这些变量的地址:
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/

    相关文章:

    c - 两个指针(数组)相减,(C语言)

    arrays - sscanf 多个格式说明符到单个数组

    c - 链表清除函数

    c++ - 一个简单的 C++ 程序崩溃了吗?

    c++ - 有没有办法使用初始化为第一行的指针访问二维数组的第二行?

    c - Little Endian 与 Big Endian 数据结构会改变我的答案吗?

    c - 线程中的全局变量指针

    c - 再次修改常量..使用 void 指针

    c - 为什么数组的地址等于它在 C 中的值?

    c++ - 为什么指针或值的递增会导致循环中的相同结果