1

temp2temp3他们都指向头有什么区别

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

5 回答 5

6

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

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

内存、地址和指针

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

  • 地址
  • 价值观

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

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

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

例子

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

node head = 631; 

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

----------------------------------
| 地址。| 瓦尔 | 姓名 |
----------------------------------
| 0x002 | 第631章 头|
----------------------------------

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

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

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

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

----------------------------------
| 地址。| 瓦尔 | 姓名 |
----------------------------------
| 0x005 | 0x002 | 温度2 |
----------------------------------

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

同样的情况temp3再次发生。

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

以及对应的地址/值对:

----------------------------------
| 地址。| 瓦尔 | 姓名 |
----------------------------------
| 0x007 | 0x005 | 温度3 |
----------------------------------

这段代码的内存布局

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

本示例看起来像这样:

在此处输入图像描述

地址和取消引用

为了把它变成一个关于指针的中途综合答案,让我们快速看一下&*

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

----------------------------------
| 地址。| 瓦尔 | 姓名 |
----------------------------------

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

&temp3 == 0x007

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

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

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

记住:

----------------------------------
| 地址。| 瓦尔 | 姓名 |
----------------------------------
| 0x005 | 0x002 | 温度2 |
----------------------------------
| 0x007 | 0x005 | 温度3 |
----------------------------------
  1. 地址”中存储的值temp30x005
  2. “存储在地址中的任何内容”0x005temp2.

所以

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

自从

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

您会看到:取消引用 ( *) 与 address-of 准相反&

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

于 2013-07-23T04:27:27.983 回答
1

任何指针都保存一个内存地址,并且大部分需要 4 个字节(在 32 位系统中)的内存来保存这个地址。根据这个定义,我们可以定义一个指向指针的指针,如下所示:

pointer to pointer:内存中的 4 个字节,用于保存另一个内存位置的地址,它保存其他内存位置的地址

现在,我们可以定义 temp2 和 temp3 如下:

temp2:内存中保存对象地址的地方node。(大多数情况下,32 位系统中的每个地址都需要 4 个字节的内存),该地址与head对象内容等价。

temp3:内存中的一个位置,用于保存指向node内存中对象的指针的地址,该指向节点的指针可以定义为node指针。
因此 temp3 保留了头节点的地址,并且由于head变量的类型是单个地址,因此需要&运算符来获取head变量的地址。

于 2013-07-23T03:49:26.793 回答
1

指针存储数据结构的内存位置,例如您的列表。指向指针的指针将存储指针的内存位置。它需要额外的取消引用才能获得列表的头部。所以 no temp2 和 temp3 不都指向头部。temp2 指向 head 指向的位置,而 temp3 指向 head 指针的内存位置。

于 2013-07-23T03:36:49.830 回答
0

你可以做

*temp3 = new_head;

*temp2 = new_head;

不工作

它对功能很有用,例如

void make_list(Node ** head) {
    *head = malloc(sizeof(Node);
} 
于 2013-07-23T03:37:48.360 回答
0

指针是保存变量地址的变量。

我们可以这样声明:

char *a;

然后我们可以分配一个变量的地址,例如:

char b='r';

像这样 :

a=&b;

指向指针的指针也是一个保存指针地址的变量(保存任何变量地址的变量)。

我们像这样声明它:

char **c;

然后我们可以分配指针的地址,即,a像这样:

c=&a;

由于ccontains 的地址a包含 b 的地址,我们稍后可以使用 a 取消引用它**

通过这个简单的示例,您可以理解这两个语句的含义。祝你好运 !!

于 2013-07-23T04:13:31.213 回答