指针指针和指针之间有什么区别

1 c pointers

是什么区别temp2temp3它们都指向头

node* temp2 = head;
node** temp3 = &head;
Run Code Online (Sandbox Code Playgroud)

Pix*_*ist 6

指针指针和指针之间有什么区别

实际上两个指针都是相同的:存储在存储器中的存储位置.它们仅在存储在它们指向的存储器位置的内容上有所不同.

内存,地址和指针

您可以将程序员视图中的计算机内存视为对列表:

  • 地址

每个命名的对象/变量name对应于

  • 一定的值(通过访问name)
  • 在特定的内存地址(通过访问&name)

因此,一个存储器值/地址对.

让我们假设(为简单起见)这node是一个整数类型.如果我们head用值定义631:

node head = 631; 
Run Code Online (Sandbox Code Playgroud)

0x002将选择某个存储器位置(即)(编译器将选择一个偏移量,OS将指示存储器中的最终位置),该值631将存储在该位置.

----------------------------------
|   Addr.    |    Val   |  Name  |
----------------------------------
|   0x002    |    631   |  head  |
----------------------------------

head现在(且仅)是特定内存位置(0x002在此示例中)的值的别名或名称.

如果我们定义一个指针,就没有什么不同的事情发生了.

node* temp2 = &head; // &head == 0x002
Run Code Online (Sandbox Code Playgroud)

再次选择存储位置(即0x005)并将值(0x002)存储在该位置.

----------------------------------
|   Addr.    |    Val   |  Name  |
----------------------------------
|   0x005    |   0x002  |  temp2 |
----------------------------------

同样,变量名temp2只是存储的任何值的别名0x005.

同样的事情temp3再次发生.

node** temp3 = &temp2; // &temp2 == 0x002
Run Code Online (Sandbox Code Playgroud)

以及相应的地址/值对:

----------------------------------
|   Addr.    |    Val   |  Name  |
----------------------------------
|   0x007    |   0x005  |  temp3 |
----------------------------------

此代码的内存布局

node head = 631;
node* temp2 = &head;
node** temp3 = &temp2;
Run Code Online (Sandbox Code Playgroud)

对于本示例看起来像这样:

在此输入图像描述

地址和解除引用

把它变成相对于指针中途全面的答案,让我们快速浏览一下&*.

正如我已经写过的,每个都Name代表一个值/地址对.

----------------------------------
|   Addr.    |    Val   |  Name  |
----------------------------------

如果您决定申请&某个名称,您将获得价值/地址对的地址,即:

&temp3 == 0x007
Run Code Online (Sandbox Code Playgroud)

如果您应用*,则这是存储在与当前值对应的地址的任何内容的别名.

*temp3意思是:" 给我存储在存储在值中的地址的任何东西temp3 "所以我们在这里有两个步骤:

  1. 获取存储在值中的地址 temp3
  2. 提供存储在该地址的任何内容

记得:

----------------------------------
|   Addr.    |    Val   |  Name  |
----------------------------------
|   0x005    |   0x002  |  temp2 |
----------------------------------
|   0x007    |   0x005  |  temp3 |
----------------------------------
  1. " 存储在值中的地址temp3 "是0x005.
  2. "无论存储在地址中的0x005是什么" 都是temp2.

因此

*temp3 == temp2 // temp2 is the dereferenced value of temp3
Run Code Online (Sandbox Code Playgroud)

以来

temp3 == &temp2 // value of temp3 is address of temp2
Run Code Online (Sandbox Code Playgroud)

你看:Dereferencing(*)与地址的准相反&.

注意:*在声明中声明一个指针,而不是取消引用地址的运算符.

  • 谢谢.因为它实际上是一致的例子:我刚在Illustrator中制作.;) (2认同)