1. 指针有什么用?
1.1.1 指针应用之一,交换两个变量的值
比如:
1 void swap(int *pa,int *pb) 2 3 { 4 5 int t=*pa; 6 7 *pa=*pb; 8 9 *pb=t; 10 11 } 12 13 int main(void) 14 15 { 16 17 int a=5,b=6; 18 19 swap(&a,&b); 20 21 printf(“%d%d\n”,a,b); 22 23 24 25 return 0; 26 27 }
指针用在函数返回多个值,传进去的参数实际上是需要保存带回来的结果变量。
1 int main(void) 2 3 { 4 5 int a[]={1,2,3,4,5,6,7,8,9,12,13,14,15,23,24,56}; 6 7 int min,max; 8 9 minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); 10 11 printf(“min=%d,max=%d\n”,min,max); 12 13 return 0; 14 15 } 16 17 void minmax(int a[],int len,int *min,int *max) 18 19 { 20 21 int i; 22 23 *min=*max=a[0]; 24 25 for(i=1;i<len;i++) 26 27 { 28 29 if(a[i]<*min) 30 31 { 32 33 *min=a[i]; 34 35 } 36 37 if(a[i]>*max) 38 39 { 40 41 *max=a[i]; 42 43 } 44 45 } 46 47 }
2 指针应用场景二,函数返回运算状态,结果通过指针返回。常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错。-1或0(在文件操作会看到大量的例子)。但是当任何数值都是有效的可能结果时,就得分开返回了。
例,两个整数做除法的函数。
1 int divide(int a,int b,int *result) 2 3 { 4 5 int ret=1; 6 7 if(b==0) 8 9 { 10 11 ret=0; 12 13 } 14 15 else 16 17 { 18 19 *result=a/b; 20 21 } 22 23 return ret; 24 25 } 26 27 int main(void) 28 29 { 30 31 int a=5; 32 33 int b=2; 34 35 int c; 36 37 if(divide(a,b,&c) 38 39 { 40 41 printf(“%d/%d=%d\n”,a,b,c); 42 43 } 44 45 46 47 return 0; 48 49 }
后续的语言(C++,Java)采用了异常机制来解决这个问题。
指针最常见的错误:定义了指针变量,还没有指向任何变量,就开始使用指针。
参考文献:
mooc,翁恺,c语言进阶