指针的应用场景一
· 交换两个变量的值
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取访问任何数据