[英]Pointers in C: changes inside a function
我遇到了這段代碼:
#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
,以便能夠更清楚地區分。 這不會改變任何行為。
所以主要首先調用foo(p1, p2);
。 然后fp1
和fp2
是指針p1
和p2
副本。 在foo中:
fp1 = fp2;
fp2被分配給fp1。 因此,fp1和fp2都保持分配的數組p2的地址(即m
在main內)。 *p1 = *p2 + 1;
因為p1和p2都保存m(或m [0]的地址,這對於數組是相同的),m [0]遞增(是4,現在是5)。 然后調用bar(&p1, &p2);
。 所以bp1
和bp2
現在在bp2
保存了兩個指針p1
和p2
的地址(即你可以從bar內修改p1和p2!),這也將發生:
bp1 = bp2;
再次,兩個指針都保持相同的地址,這是主要的p2之一(仍然具有m [0]的地址)。 *bp1 = *bp2 + 1;
因為bp1和bp2都指向同一個指針,導致該指針遞增,所以有效地遞增p2,現在指向m [1]。 **bp1 = **bp2 + 2;
bp1和bp2都指向p2,指向m [1]。 所以m [1]增加2(m [1]是5,現在是7!)。 最后打印值。 記住,p2本身在bar內被修改,現在指向m [1],再次被修改為7,所以結果你沒想到...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.