我在跟踪这个教程关于指针是如何工作的。
让我引述有关段落:
int i = 5, j = 6, k = 7; int \*ip1 = &i, \*ip2 = &j; 现在我们可以设置int **ipp =&ip1 1;
ipp指向ip1,它指向i。*ipp是ip1,**ipp是i,或者5。我们可以用我们熟悉的方框和箭头符号来说明这种情况,如下所示:

如果我们说
\*ipp = ip2;我们已经将ipp (即ip1)指向的指针更改为包含ip2的副本,以便它(ip1)现在指向j:

我的问题是:为什么在第二张图片中,ipp仍然指向ip1而不是ip2
发布于 2014-02-06 14:04:09
别再提指点类比了。指针真正包含的是内存地址。&是运算符的“地址”,即它返回对象内存中的地址。*操作符给您一个指针引用的对象,即给定一个包含地址的指针,它在该内存地址处返回对象。因此,当您执行*ipp = ip2时,您要做的是将对象保存在ipp中的地址上,即ip1,然后将存储在ip2中的值分配给ip1,这是j的地址。
简单
& -地址
* ->值
发布于 2014-02-06 14:01:22
因为您更改了ipp所指向的值,而不是ipp的值。因此,ipp仍然指向ip1 (ipp的值),ip1的值现在与ip2的值相同,所以它们都指向j。
这是:
*ipp = ip2;与以下相同:
ip1 = ip2;发布于 2014-02-06 16:11:46
与C标记中的大多数初学者问题一样,这个问题可以通过回到基本原则来回答:
&运算符将变量转换为指针。*运算符将指针转换为变量。(从技术上讲,我应该说"lvalue“而不是”变量“,但我觉得将可变存储位置描述为”变量“更为明确。)
所以我们有变量:
int i = 5, j = 6;
int *ip1 = &i, *ip2 = &j;变量ip1包含一个指针。&运算符将i转换为指针,并将指针值赋值给ip1。因此,ip1包含指向i的指针。
变量ip2包含一个指针。&运算符将j转换为指针,并将该指针分配给ip2。因此,ip2包含指向j的指针。
int **ipp = &ip1;变量ipp包含一个指针。&运算符将变量ip1转换为指针,并将指针值赋值给ipp。因此,ipp包含指向ip1的指针。
让我们总结一下到目前为止的故事:
i包含5j包含6ip1包含“指向i的指针”ip2包含“指向j的指针”ipp包含“指向ip1的指针”现在我们说
*ipp = ip2;*操作符将指针返回到变量中。我们获取ipp的值,它是“指向ip1的指针,并将其转换为变量。什么变量?当然是ip1!”
因此,这只是另一种说法。
ip1 = ip2;因此,我们获取ip2的值。那是什么?“指向j的指针”我们将指针值赋值给ip1,因此ip1现在是“指向j的指针”。
我们只改变了一件事:ip1的价值
i包含5j包含6ip1包含“指向j的指针”ip2包含“指向j的指针”ipp包含“指向ip1的指针”为什么
ipp仍然指向ip1而不是ip2?
变量在分配给它时会发生更改。计算赋值;对变量的更改不能超过有赋值!首先分配给i、j、ip1、ip2和ipp。然后将其分配给*ipp,正如我们所看到的,它的意思与“分配给ip1”的意思相同。因为您没有第二次分配给ipp,所以它没有改变!
如果您想要更改ipp,那么您必须实际分配给ipp
ipp = &ip2;例如。
https://stackoverflow.com/questions/21604946
复制相似问题