temp2
和temp3
之间有什么区别,他们都指向头
node* temp2 = head;
node** temp3 = &head;
答案 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;
对于本示例,看起来像这样:
要将此转化为针对指针的中途综合答案,让我们快速了解&
和*
。
正如我已经写过的,每个Name
代表一个值/地址对。
---------------------------------- | Addr. | Val | Name | ----------------------------------
如果您决定将&
应用于某个名称,您将获得值/地址对的地址,即:
&temp3 == 0x007
如果您应用*
,则这是存储在与当前值对应的地址的任何内容的别名。
*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
自
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的地址,我们以后可以使用**
取消引用它
通过这个简单的例子,你可以理解这两个陈述的意思。祝你好运!!