簡體   English   中英

C中的指針:在函數內部發生變化

[英]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中的p1p2以及函數中的p1p2 ,它們是不相同的。 所以我將foo和bar的參數重命名為fp1fp2bp1fp2 ,以便能夠更清楚地區分。 這不會改變任何行為。

所以主要首先調用foo(p1, p2); 然后fp1fp2是指針p1p2副本。 在foo中:

  1. fp1 = fp2; fp2被分配給fp1。 因此,fp1和fp2都保持分配的數組p2的地址(即m在main內)。
  2. *p1 = *p2 + 1; 因為p1和p2都保存m(或m [0]的地址,這對於數組是相同的),m [0]遞增(是4,現在是5)。

然后調用bar(&p1, &p2); 所以bp1bp2現在在bp2保存了兩個指針p1p2的地址(即你可以從bar內修改p1和p2!),這也將發生:

  1. bp1 = bp2; 再次,兩個指針都保持相同的地址,這是主要的p2之一(仍然具有m [0]的地址)。
  2. *bp1 = *bp2 + 1; 因為bp1和bp2都指向同一個指針,導致該指針遞增,所以有效地遞增p2,現在指向m [1]。
  3. **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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM