我遇到了这个密码:

#include <stdio.h>

void foo(int* p1, int* p2)
{
   p1 = p2;
   *p1 = *p2 + 1;
}

void bar(int** p1, int** p2)
{
  p1 = p2;
  *p1 = *p2 + 1;
  **p1 = **p2 + 2;
}

void main (void)
{
  int n[] = {1,2,3};
  int m[] = {4,5,6};
  int *p1 = n;
  int *p2 = m;

  foo(p1,p2);
  bar(&p1,&p2);
  printf("%d %d\n",*p1,*p2);
}

我以为输出是[1,5],而它是[1,7]。
有人能解释一下原因吗?
谢谢

最佳答案

首先,您需要区分main中的p1p2以及函数中的p1p2,它们是不同的。因此,我将把foo和bar的参数重命名为fp1fp2bp1fp2,以便能够更清楚地区分。这不会改变任何行为。
所以main首先调用foo(p1, p2);fp1fp2则是指针p1p2的副本。在foo中:
fp1 = fp2;fp2被分配给fp1。所以fp1和fp2都保留了数组p2被分配到的地址(即main中的m)。
*p1 = *p2 + 1;由于p1和p2都持有m(或m[0]的地址,这对于数组是相同的),m[0]递增(原来是4,现在是5)。
然后调用bar(&p1, &p2);。所以bp1bp2现在在main中保存两个指针p1p2的地址(即,您可以在bar中修改p1和p2本身!),这也将发生在:
bp1 = bp2;同样,两个指针都持有相同的地址,即main中的p2之一(地址仍然为m[0])。
*bp1 = *bp2 + 1;由于bp1和bp2都指向同一个指针,因此导致该指针递增,因此有效地递增p2,现在指向m[1]。
**bp1 = **bp2 + 2;bp1和bp2都指向p2,p2指向m[1]。所以m[1]增加了2(m[1]是5,现在是7!).
最后打印值。记住,p2本身在bar中被修改,现在指向m[1],m[1]再次被修改为7,所以结果出乎意料。。。

关于c - C中的指针:函数内部的更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38157782/

10-10 14:25