關於【指針作為形參,改變實參的值】的理解!


0x01

  先上代碼:

 1 #include <stdio.h>
 2 
 3 void swap(int *p, int *q)
 4 {
 5     int temp;
 6     temp = *p;
 7     *p = *q;
 8     *q = temp;
 9 }
10 
11 int main()
12 {
13     int a, b;
14     int *pa, *pb;
15     printf("Enter 2 numbers:\n");
16     scanf("%d, %d", &a, &b);
17     pa = &a;
18     pb = &b;
19 
20     printf("a = %d, b = %d\n", a, b);
21     printf("=====Changed======\n");
22     swap(pa, pb);
23     printf("a = %d, b = %d\n", a, b);
24 }

  代碼的作用:通過指針交換兩個變量的值。

 

  運行結果:

  

 

0x02

  指針是如何交換兩個變量的值的?

  首先需要明白下面的東西:

  (1)星號"*"的兩個作用:①定義指針變量  ②指明指針所指變量的值(間接訪問)

  (2)指針變量作為函數參數,是將變量的地址傳遞給函數;

 

  分析:swap()函數的參數是指針變量,所以接收的是變量的地址,【(這段話是在網上看到的)指針傳遞的是變量的地址,也就是它在內存中的所在位置,它發生改變,變量就改變;一般變量做形參,傳遞的是變量的值,地址不發生改變,函數在執行過程中調用內存空間,執行完便釋放內存空間,所以不改變。】

  在交換變量值的代碼中,重要的是(*p = *q, *q = temp),這句代碼的作用是,將指針q指向的內容賦給指針p所指的區域。

  自己的理解:*p = *q; *p指的是指針變量p(*號的作用是定義指針變量),*q指的是間接訪問q所指區域中的值(*號的作用是間接訪問),將這個值賦予p所指的區域,也就是【地址】,這個地址是傳入的a的地址,所以a的地址(或者說a對應的內存空間)中存放的內容就改變了,成了q的所指區域中的值,也就是b的值,這樣就完成了交換。重要的還是要分清星號*的兩個作用。 ====但是還有疑問,值能直接賦給地址?或者說星號*在等號左右兩邊的意義不同,在左邊表示變量,右邊表示間接訪問?====

  temp = *p;  temp是一個整型變量,*p是間接訪問指針所指區域的內容,也就是a的值,所以這句代碼的作用就是將a的值賦值給temp;

  *q = temp; temp之前被賦予a的值,*q指的是指針變量q(*號的作用是定義指針變量),值是b的地址,將a的值放在b的地址中,所以b對應的內存空間中的內容成了a的值。

 

0x03

  下面代碼也是同樣的道理:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int a, *p;
 5     int b = 10;
 6     printf("Enter a number:\n");
 7     scanf("%d", &a);
 8     p = &a;
 9     printf("a = %d\n", a);
10     printf("*p = %d\n", *p);
11 
12     printf("\n=============\n");
13     *p = b;
14     printf("a = %d\n", a);
15     printf("*p = %d\n", *p);
16 }

  首先指針p指向變量a,然后通過*p = b; 改變了a的值;

  運行結果:

  

  

0x04

  其實不只是指針作為形參改變實參,而是指針就具有這個“特性”。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM