我遇到了这个密码:
#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中的p1
和p2
以及函数中的p1
,p2
,它们是不同的。因此,我将把foo和bar的参数重命名为fp1
,fp2
,bp1
,fp2
,以便能够更清楚地区分。这不会改变任何行为。
所以main首先调用foo(p1, p2);
。fp1
和fp2
则是指针p1
和p2
的副本。在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);
。所以bp1
和bp2
现在在main中保存两个指针p1
和p2
的地址(即,您可以在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/