temp2
和temp3
他们都指向头有什么区别
node* temp2 = head;
node** temp3 = &head;
指针指针和指针有什么区别
实际上两个指针是相同的:存储在内存中的内存位置。它们仅在它们指向的内存位置存储的内容不同。
您可以从程序员的角度将计算机内存视为一对列表:
每个命名对象/变量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
”所以我们这里有两个步骤:
temp3
记住:
---------------------------------- | 地址。| 瓦尔 | 姓名 | ---------------------------------- | 0x005 | 0x002 | 温度2 | ---------------------------------- | 0x007 | 0x005 | 温度3 | ----------------------------------
temp3
是0x005
。0x005
是temp2
.所以
*temp3 == temp2 // temp2 is the dereferenced value of temp3
自从
temp3 == &temp2 // value of temp3 is address of temp2
您会看到:取消引用 ( *
) 与 address-of 准相反&
。
注意:*
在声明中声明一个指针,而不是取消引用地址的运算符。
任何指针都保存一个内存地址,并且大部分需要 4 个字节(在 32 位系统中)的内存来保存这个地址。根据这个定义,我们可以定义一个指向指针的指针,如下所示:
pointer to pointer
:内存中的 4 个字节,用于保存另一个内存位置的地址,它保存其他内存位置的地址
现在,我们可以定义 temp2 和 temp3 如下:
temp2
:内存中保存对象地址的地方node
。(大多数情况下,32 位系统中的每个地址都需要 4 个字节的内存),该地址与head
对象内容等价。
temp3
:内存中的一个位置,用于保存指向node
内存中对象的指针的地址,该指向节点的指针可以定义为node
指针。
因此 temp3 保留了头节点的地址,并且由于head
变量的类型是单个地址,因此需要&
运算符来获取head
变量的地址。
指针存储数据结构的内存位置,例如您的列表。指向指针的指针将存储指针的内存位置。它需要额外的取消引用才能获得列表的头部。所以 no temp2 和 temp3 不都指向头部。temp2 指向 head 指向的位置,而 temp3 指向 head 指针的内存位置。
你可以做
*temp3 = new_head;
但
*temp2 = new_head;
不工作
它对功能很有用,例如
void make_list(Node ** head) {
*head = malloc(sizeof(Node);
}
指针是保存变量地址的变量。
我们可以这样声明:
char *a;
然后我们可以分配一个变量的地址,例如:
char b='r';
像这样 :
a=&b;
指向指针的指针也是一个保存指针地址的变量(保存任何变量地址的变量)。
我们像这样声明它:
char **c;
然后我们可以分配指针的地址,即,a
像这样:
c=&a;
由于c
contains 的地址a
包含 b 的地址,我们稍后可以使用 a 取消引用它**
通过这个简单的示例,您可以理解这两个语句的含义。祝你好运 !!