gpt4 book ai didi

c - 指向指针的指针和指针有什么区别

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:55 25 4
gpt4 key购买 nike

temp2temp3有什么区别,它们都指向head

node* temp2 = head;
node** temp3 = &head;

最佳答案

What is the difference between pointer to pointer and a pointer

其实这两个指针是一样的:一个存储在内存中的内存位置。它们仅在它们指向的内存位置存储的内容不同。

内存、地址和指针

您可以从程序员的角度将计算机内存视为成对列表:

  • 地址
  • 值(value)观

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

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

因此是内存值/地址对之一。

示例

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

node head = 631; 

将选择某个内存位置(即 0x002)(编译器将选择一个偏移量,操作系统将指定内存中的最终位置)和值 631将存储在该位置。

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

head is now (and only) an alias or name for the value at a specific memory position (0x002 in this example).

If we define a pointer, there is nothing different happening.

node* temp2 = &head; // &head == 0x002

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

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

And again the variable name temp2 is only an alias for whatever value is stored in 0x005.

The same goes for temp3 again.

node** temp3 = &temp2; // &temp2 == 0x002

以及相应的地址/值对:

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

The memory layout of this code

node head = 631;
node* temp2 = &head;
node** temp3 = &temp2;

当前示例看起来像这样:

enter image description here

地址和解引用

为了将其转化为关于指针的半途综合答案,让我们快速浏览一下 &*

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

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

If you decide to apply & to a certain name, you will get the address of the value/address pair i.e.:

&temp3 == 0x007

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

*temp3 表示:“给我存储在 temp3 值中的地址中存储的任何内容”所以我们在这里有两个步骤:

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

记住:

----------------------------------|   Addr.    |    Val   |  Name  |----------------------------------|   0x005    |   0x002  |  temp2 |----------------------------------|   0x007    |   0x005  |  temp3 |----------------------------------
  1. The "address that is stored in the value of temp3" is 0x005.
  2. "Whatever is stored at the address" 0x005 is temp2.

Therefore

*temp3 == temp2 // temp2 is the dereferenced value of temp3

自从

temp3 == &temp2 // value of temp3 is address of temp2

你看:取消引用 (*) 与 address-of & 是准相反的。

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

关于c - 指向指针的指针和指针有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17801037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com