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

时间:2013-07-23 03:30:14

标签: c pointers

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

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

5 个答案:

答案 0 :(得分:6)

  

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

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

内存,地址和指针

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

  • 地址

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

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

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

示例

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

node head = 631; 

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

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

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

如果我们定义一个指针,就会发生 nothing 不同的事情。

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

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

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

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

同样适用于temp3

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

相应的地址/值对:

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

此代码的内存布局

node head = 631;
node* temp2 = &head;
node** temp3 = &temp2;
对于本示例,

看起来像这样:

enter image description here

地址和解除引用

要将此转化为针对指针的中途综合答案,让我们快速了解&*

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

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

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

&temp3 == 0x007

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

*temp3表示:" 向我提供存储在temp3 "的值中的地址。 所以我们在这里有两个步骤:

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

    ----------------------------------
    |   Addr.    |    Val   |  Name  |
    ----------------------------------
    |   0x005    |   0x002  |  temp2 |
    ----------------------------------
    |   0x007    |   0x005  |  temp3 |
    ----------------------------------
    1. " 地址,存储在temp3 "的值中是0x005
    2. "无论存储在地址" 0x005temp2
    3. 因此

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

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

      您会看到:解除引用(*)与地址&完全相反。

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

答案 1 :(得分:1)

指针存储数据结构的内存位置,例如列表。指向指针的指针将存储指针的内存位置。需要额外的解引用来获得列表的头部。所以没有temp2和temp3都没有指向头部。 temp2指向head指向的位置,而temp3指向head指针的内存位置。

答案 2 :(得分:1)

任何指针都会保留地址的内存,并且需要大多数4bytes(在32位系统中)的内存来保留此地址。根据这个定义,我们可以定义一个指向指针的指针:

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

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

temp2:内存中保留node对象的地址的位置。 (大多数32位系统中的每个地址都需要4个字节的内存),这个地址等同于head对象内容。

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

答案 3 :(得分:0)

你可以做到

*temp3 = new_head;

但是

*temp2 = new_head;

不起作用

对于诸如

之类的功能非常有用
void make_list(Node ** head) {
    *head = malloc(sizeof(Node);
} 

答案 4 :(得分:0)

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

我们可以声明它:

char *a;

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

char b='r';

像这样:

a=&b;

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

我们声明如下:

char **c;

然后我们可以指定指针的地址,即a,如下所示:

c=&a;

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

通过这个简单的例子,你可以理解这两个陈述的意思。祝你好运!!