1、構建swap函數,實現兩個整型變量數值的交換,且使用指針類型的數據作為swap函數的參數。
#include<stdio.h> void swap(int *p,int *q)//定義swap函數,定義兩個指針參數 { int m;// 定義一個整形m來做數據交換的中介 m=*p; *p=*q; *q=m;//3步交換 } main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函數調用前:%d %d\n",a,b); swap(&a,&b);//調用swap函數,將啊a,b的地址傳給swap函數 printf("swap函數調用后:%d %d\n",a,b); }
輸入a,b的值:1 2
swap函數調用前:1 2
swap函數調用后:2 1
--------------------------------
Process exited after 2.178 seconds with return value 0
請按任意鍵繼續. . .
總結:
主函數中的整形參數a,b通過利用取址&a,&b調用swap函數並向函數中的指針p,q傳遞地址,p,q通過地址訪問a,b的值並在swap函數內調換,做到利用函數進行調換的效果
2、void swap(int *p,int *q){int *m;*m=*p;*p=*q;*q=*m;}為何無法實現交換?
#include<stdio.h> void swap(int *p,int *q)//定義swap函數,定義兩個指針參數 { int *m;// 此處將源代碼中的整形m換成一個指針m用來交換 *m=*p; *p=*q; *q=*m; } main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函數調用前:%d %d\n",a,b); swap(&a,&b);//調用swap函數 printf("swap函數調用后:%d %d\n",a,b); }
蹦出錯誤提示 進行程序調試
void swap(int *p,int *q) { int *m;// 此處將源代碼中的整形m換成一個指針m用來交換 *m=*p;//在調用swap函數時該步出錯
*p=*q;
*q=*m;
}
出錯原因很簡單,因為指針是一個值為內存地址的變量,一個有效的指針必然是以下三種狀態之一:1.保存一個特定對象的地址;2.指向某個對象后面的另一對象;3.是0值。若指針保存0值,表明它不指向任何對象。未初始化的指針是無效的,直到給該指針賦值后,才可以使用它。我們定義的一個指針int *m,m可以儲存一個指向int型數據的內存單元的地址,然后用簡介運算符*去訪問m指向的地址的內存單元所儲存的值,但在剛定義完指針m時,它不儲存任何內存單元的地址,只是存放一個隨機的不確定的值,這時候我們利用*m=*p等於在調用m儲存的這個不確定值作為的地址中存儲的數據。這是錯誤且非法的,因此在調用未初始化的指針時,編譯器往往會給出崩潰的提示,我們可以試着為指針m指向一個開辟出來的內存空間來驗證
#include<stdio.h>
#include<stdlib.h>
void swap(int *p,int *q)//定義swap函數,定義兩個指針參數 { int *m;// 將源代碼中的整形m換成一個指針m用來交換 m=(int *)malloc(100);//開辟一個大小為100字節的空間並讓指針m指向這個儲存空間的地址 *m=*p; *p=*q; *q=*m; }
main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函數調用前:%d %d\n",a,b); swap(&a,&b);//調用swap函數 printf("swap函數調用后:%d %d\n",a,b); }
輸入a,b的值:1 2
swap函數調用前:1 2
swap函數調用后:2 1
--------------------------------
Process exited after 2.177 seconds with return value 0
請按任意鍵繼續. . .
程序運行成功
總結:
要切記指針是一個值為內存地址的變量,在定義完一個指針后,若它不指向一個內存單元的地址,則它本身是無法儲存其他數據的。
3、void swap(int *p,int *q){int *m;m=p;p=q;q=m;}為何無法實現交換?
#include<stdio.h>
void swap(int *p,int *q)//定義swap函數,定義兩個指針參數 { int *m;// 將源代碼中的整形m換成一個指針m用來交換m=p;//讓指針m獲得指針p儲存的地址 p=q;//讓指針p獲得指針q儲存的地址 q=m;//讓指針q獲得指針m儲存的地址 }
main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函數調用前:%d %d\n",a,b); swap(&a,&b);//調用swap函數 printf("swap函數調用后:%d %d\n",a,b); }
輸入a,b的值:1 2
swap函數調用前:1 2
swap函數調用后:1 2
--------------------------------
Process exited after 1.353 seconds with return value 0
請按任意鍵繼續. . .
這道題的問題在於swap函數並未能成功調換a,b的值,輸入的是a=1,b=2調用函數前和調用函數后a,b的值都不變,問題出在雖然調用swap時程序將a,b的地址傳遞給了swap函數中定義的指針p,q但是在swap函數內,只交換了指針p,q的地址,並非對地址中所儲存的值進行調換,所以a的地址和值不變,b的地址和值也不變,輸出時a,b自然也不會變,可以通過輸出指針p,q在轉換前后的值進行驗證
#include<stdio.h>
void swap(int *p,int *q)//定義swap函數,定義兩個指針參數 { int *m;// 將源代碼中的整形m換成一個指針m用來交換 printf("交換前指針p,q所指向地址的值:%d %d\n",*p,*q); m=p; p=q; q=m; printf("交換后指針p,q所指向地址的值:%d %d\n",*p,*q); }
main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函數調用前:%d %d\n",a,b); swap(&a,&b);//調用swap函數 printf("swap函數調用后:%d %d\n",a,b); }
輸入a,b的值:1 2
swap函數調用前:1 2
交換前指針p,q所指向地址的值:1 2
交換后指針p,q所指向地址的值:2 1
swap函數調用后:1 2
--------------------------------
Process exited after 2.074 seconds with return value 0
請按任意鍵繼續. . .
總結:
當需要調用函數對變量進行修改時,需要利用指針通過地址間接訪問變量,再對變量進行修改。
4、構建comp函數,實現兩個整數比較,比較大的值通過返回值返回給main。要求comp的參數和返回值都是指針類型數據。
#include<stdio.h> int comp(int *p,int*q)//定義comp函數,定義兩個指針參數 { if(*p>*q)return *p;//如果指針p指向的值大於指針q指向的值,返回*p else return *q;//反之如果指針q指向的值大於指針p指向的值,返回*q } main() { int a,b;//定義兩個整形變量a,b printf("輸入a,b的值:") ; scanf("%d %d",&a,&b); printf("comp函數調用前:%d %d\n",a,b); printf("comp函數調用后輸出較大的值:%d\n",comp(&a,&b));//輸出調用comp函數后得到的a,b間的較大值 }
輸入a,b的值:1 2
comp函數調用前:1 2
comp函數調用后輸出較大的值:2
--------------------------------
Process exited after 2.001 seconds with return value 0
請按任意鍵繼續. . .
總結:
當需要調用函數對變量進行比較時,需要利用指針通過地址間接訪問變量,再對變量進行比較。