是什么区别temp2和temp3它们都指向头
node* temp2 = head;
node** temp3 = &head;
Run Code Online (Sandbox Code Playgroud)
指针指针和指针之间有什么区别
实际上两个指针都是相同的:存储在存储器中的存储位置.它们仅在存储在它们指向的存储器位置的内容上有所不同.
您可以将程序员视图中的计算机内存视为对列表:
每个命名的对象/变量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 "所以我们在这里有两个步骤:
temp3记得:
---------------------------------- | Addr. | Val | Name | ---------------------------------- | 0x005 | 0x002 | temp2 | ---------------------------------- | 0x007 | 0x005 | temp3 | ----------------------------------
temp3 "是0x005.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(*)与地址的准相反&.
注意:*在声明中声明一个指针,而不是取消引用地址的运算符.