我个人的看法是,带有箭头的图片会指向这种方式,或者使指针更难以理解。它确实使它们看起来像是一些抽象的神秘实体。他们不是。
像计算机上的其他所有内容一样,指针就是数字。名称“指针”只是说“包含地址的变量”的一种奇特的方式。
因此,让我通过解释计算机的实际工作方式来搅动一切。
我们有一个int
,它的名称i
和值为5。它存储在内存中。像存储在内存中的所有内容一样,它需要一个地址,否则我们将无法找到它。可以说i
结束于地址0x12345678,其伙伴j
值为6 紧随其后。假设int是4个字节,指针是4个字节的32位CPU,则变量将如下存储在物理内存中:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
现在我们要指向这些变量。我们创建一个指向int的指针int* ip1
,然后创建一个int* ip2
。像计算机中的所有内容一样,这些指针变量也分配在内存中的某个位置。假设它们结束于紧接在内存中的下一个相邻地址j
。我们将指针设置为包含先前分配的变量ip1=&i;
的地址:(“将i的地址复制到ip1”)和ip2=&j
。两行之间发生的是:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
因此,我们得到的只是包含数字的4个字节的内存块。视线中没有神秘或神奇的箭头。
实际上,仅通过查看内存转储就无法判断地址0x12345680是否包含int
或int*
。不同之处在于我们的程序选择使用此地址存储的内容的方式。(我们程序的任务实际上只是告诉CPU如何处理这些数字。)
然后,我们使用添加另一个间接级别int** ipp = &ip1;
。同样,我们只是获得了一块内存:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
该模式看起来确实很熟悉。4个字节的另一个块包含一个数字。
现在,如果我们有上述虚拟RAM的内存转储,则可以手动检查这些指针指向的位置。我们窥视ipp
变量地址中存储的内容,并找到内容0x12345680。当然,这ip1
是存储地址。我们可以转到该地址,检查其中的内容,然后找到的地址i
,最后,我们可以转到该地址并找到数字5。
因此,如果我们获取ipp的内容*ipp
,我们将获得指针变量的地址ip1
。通过编写,*ipp=ip2
我们将ip2复制到ip1,它等效于ip1=ip2
。无论哪种情况,我们都会得到
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(这些示例是针对大端CPU给出的)
ipp
在定义时添加类型,这样您的问题就完成了;-)