【发布时间】:2018-01-15 23:58:57
【问题描述】:
我想更好地理解指针算法。我知道如何用索引重写它,但我想了解这里的指针问题。
int main(int argc, char **argv)
{
int i;
char **tmp;
i=1;
argv++;
tmp = argv; // address of first element of array is: e2b9f187
printf("ptr: %x **ptr: %x\n", argv, &(**argv));
printf("tmp: %x **tmp: %x\n", tmp, &(**tmp));
while (--argc)
{
while(**tmp)
(*tmp)++;
printf("step %x ptr %x **ptr %x\n", i, argv, &(**argv));
printf("step %x tmp %x **tmp %x\n", i, tmp, &(**tmp));
i++;
tmp++;
}
}
/* 在第一次迭代中,两个地址都改变了:**tmp: e2b9f18b、**argv: e2b9f18b,在下一次迭代中只改变了*tmp 的位置。
我的问题是为什么尽管使用了指针,**argv 的地址却发生了变化。
提前致谢。
【问题讨论】:
-
您只复制了
argv,而不是**argv。因此,您将获得 2 个指向同一内存的指针(*argv和**argv):如果一个指针更改了该内存地址,另一个指针(查看同一地址)也会看到该更改。 -
如果你去掉一层间接性(让事情更简单一些),你可以简单地在一张纸上画东西,用正方形作为内存地址:你会得到箭头(从你的两个指针)指向同一个正方形。
-
@Evert。 Thx,我明白这一点。但是这里我既不使用 *argv 也不使用 **argv,那为什么它们会改变呢?
-
那你没看懂重点:你改变的是
**tmp指向的值,而**argv也恰好指向了这个值。 -
您 (
argv) 指向一辆白色 (&(**argv)) 的汽车 (**argv)。你要求你的朋友也这样做(tmp = argv),即指向同一辆车(因此,**tmp == **argv);他们还看到这辆车是白色的 (&(**tmp))。现在您的朋友将汽车涂成彩虹色((*tmp)++或类似颜色),而您的朋友(&(**tmp))看到的汽车颜色实际上是彩虹的所有颜色。你,作为argv,现在也看到了彩虹色的汽车 (&(**argv)),而不是白色。
标签: c arrays pointers memory-address pointer-arithmetic