指針的應用場景一
· 交換兩個變量的值
void swap(int *pa, int *pb);//定義指針*pa和*pb
int main(void)
{
int a = 5;
int b = 6;
swap(&a, &b); // swap取得a和b的地址
printf("a=%d,b=%d\n",a,b);
return 0;
}
void swap(int *pa, int *pb)
{
// swap函數對*pa 和*pb進行交換
int t= *pa;
*pa = *pb;
*pb = t;
}
運行結果
a=6,b=5
在這裏我們通過swap函數對a的值和b的值進行了交換
指針應用場景二
· 函數返回多個值,某些值就只能通過指針返回
· 傳入的參數實際上時需要保存待會結果的變量
/**
取出一組數組裏的最小的和最大的值
**/
void minmax(int a[], int len, int *min, int *max);
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};
int min,max;
//main裏調用minmax數
//通過sizeof(a)/sizeof(a[0]計算元素長度
//通過&min,&max 取得地址交給minmax函數
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[], int len, int *min, int *max)
{
int i;
*min = *max =a[0]; //最小和最大都爲a[]的第一個元素
for (i=1;i<len;i++){ // 從第二個元素開始遍歷數組
if(a[i]<*min){
*min =a[i]; //如果a[i]小於*min,最小數就是a[i]
}
if(a[i]>*max){
*max =a[i]; //如果a[i]大於*max,最小數就是a[i]
}
}
}
輸出結果
min=1,max=55
指針應用場景二b
· 函數返回運算的狀態,結果通過指針返回
· 常用的方法時讓函數返回特殊的不屬於有效範圍內的值來表示出錯:
· -1和0(表示操作是否成功)
· 當任何數值都時有效的可能結果時,需要分開返回
· 在C語言是不通過的,在後續語言(C++,Java)採用了異常祭之解決了這個問題
/**
return 如果除法成功,返回1;否則返回0
**/
int divide(int a, int b,int *result);
int main(void)
{
int a=5;
int b=2;
int c;
// 如果a/b爲0,c的結果爲0不沒有任何有意義的結果
if(divide(a,b,&c)){
printf("%d/%d=%d\n", a, b, c);
}
return 0;
}
int divide(int a, int b, int *result)
{
// 如果結果是0,不做運算,如果結果不是零,返回結果
int ret = 1;
if(b == 0)ret = 0;
else{
*result = a/b;
}
return ret;
}
指針最常見的錯誤
· 定義了指針變量,還沒有指向任何變量,就開始使用指針
· 任何變量沒有得到實際變量地址之前,不能通過*p取訪問任何數據