翁愷老師C語言學習筆記(十)指針_指針的使用

指針的應用場景一
· 交換兩個變量的值

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取訪問任何數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章