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
其實不只是指針作為形參改變實參,而是指針就具有這個“特性”。
