为了进一步熟悉与指针有关的编程,这里给出一个指针综合的例子 :
编写一个函数,统计m行n列二维实型数组中整数,负数,零的个数
方法一:使用指向实型数组中正数,负数,零的个数
1 #include2 3 void totol(float *q , int *i , int *j , int *k) 4 { 5 int m , n ; 6 for(m = 0 ; m < 3 ; m++) 7 { 8 for(n = 0 ; n < 4 ; n++) 9 {10 if(*(q + m * 4 + n) > 0) 11 (*i)++ ;12 else if(*(q + m * 4 + n) < 0)13 (*j)++ ;14 else (*k)++ ;15 }16 } 17 }18 19 int main()20 {21 int plus = 0 , neg = 0 , zero = 0;22 float a[3][4]={ { 1,2,3,4},{ -1,-2,-3,-4},{ 0,0,0,0}};23 float *p ;24 p = a ;25 //p = &a[0][0];26 totol(p , &plus , &neg , &zero);27 printf("plus = %d ,neg = %d ,zero = %d \n" , plus , neg , zero);28 29 return 0 ;30 }
方法二:使用指向含有n个元素的一维数组的指针变量
1 #include2 3 void totol(float (*q)[4] , int *i , int *j , int *k) 4 { 5 int m , n ; 6 for(m = 0 ; m < 3 ; m++) 7 { 8 for(n = 0 ; n < 4 ; n++) 9 { 10 if(*(*(q + m) + n) > 0) 11 (*i)++ ; 12 else if(*(*(q + m) + n) < 0) 13 (*j)++ ; 14 else (*k)++ ; 15 } 16 } 17 } 18 19 int main() 20 { 21 int plus = 0 , neg = 0 , zero = 0; 22 float a[3][4]={ { 1,2,3,4},{ -1,-2,-3,-4},{ 0,0,0,0}}; 23 float (*p)[4] ; 24 p = a ; 25 totol(p , &plus , &neg , &zero); 26 printf("plus = %d ,neg = %d ,zero = %d \n" , plus , neg , zero); 27 28 return 0 ; 29 }
方法三:使用指针数组
1 #include2 3 void totol(float **q, int *i , int *j , int *k) 4 { 5 int m , n ; 6 for(m = 0 ; m < 3 ; m++) 7 { 8 for(n = 0 ; n < 4 ; n++) 9 {10 if(*(q[m] + n) > 0) 11 (*i)++ ;12 else if(*(q[m] + n) < 0)13 (*j)++ ;14 else (*k)++ ;15 }16 } 17 }18 19 int main()20 {21 int plus = 0 , neg = 0 , zero = 0;22 float a[3][4]={ { 1,2,3,4},{ -1,-2,-3,-4},{ 0,0,0,0}};23 float *p[3] ;24 p[0] = a[0] ; p[1] = a[1] ; p[2] = a[2];25 totol(p , &plus , &neg , &zero);26 printf("plus = %d ,neg = %d ,zero = %d \n" , plus , neg , zero);27 28 return 0 ;29 }
方法四:使用指向指针的指针
1 #include2 3 void totol(float **q, int *i , int *j , int *k) 4 { 5 int m , n ; 6 for(m = 0 ; m < 3 ; m++) 7 { 8 for(n = 0 ; n < 4 ; n++) 9 { 10 if(*(*q + m * 4 + n) > 0) //*q 是指针 **q 的指针变量 11 (*i)++ ; 12 else if(*(*q + m * 4 + n) < 0) 13 (*j)++ ; 14 else (*k)++ ; 15 } 16 } 17 } 18 19 int main() 20 { 21 int plus = 0 , neg = 0 , zero = 0; 22 float a[3][4]={ { 1,2,3,4},{ -1,-2,-3,-4},{ 0,0,0,0}}; 23 float *r , **p ; 24 r = &a[0][0] ; 25 //或者 r = a[0] ; 26 p = &r ; //把指针r的地址赋予p , p就是指向指针r的指针 27 totol(p , &plus , &neg , &zero); 28 printf("plus = %d ,neg = %d ,zero = %d \n" , plus , neg , zero); 29 30 return 0 ; 31 }
如果希望调用能将多个计算机结果带回主调函数,用return语句是无法实现的,而将指针作为函数的参数就能是函数返回多个值
1 #include2 3 void month_day(int year , int yearday , int *pmonth , int *pday); 4 5 int main(void) 6 { 7 int year , month , day ,yearday; 8 printf("please input year and yearday : "); 9 scanf("%d %d" , &year , &yearday);10 11 month_day(year , yearday , &month , &day);12 printf("%d-%d-%d \n", year , month , day);13 14 return 0 ;15 }16 17 void month_day(int year , int yearday , int *pmonth , int *pday)18 {19 int i , leap ;20 int a[2][13] = { //定义数组存放闰年与平年的每个月的天数21 { 0,31,28,31,30,31,30,31,31,30,31,30,31},22 { 0,31,29,31,30,31,30,31,31,30,31,30,31}23 };24 25 leap = (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)); // leap = 1 时为闰年26 27 for(i = 1 ; yearday > a[leap][i] ; i++) // 判断第 i 个月的第几天28 29 yearday -= a[leap][i] ;30 31 32 *pmonth = i ; //返回 i , yearday 的值到函数调用处33 *pday = yearday ; 34 }
使 4 * 4 二维数组转置
1 #include2 3 int read(int a[4][4]); 4 int exchange(int *p); 5 int print(int *q , int m , int n); 6 7 int main() 8 { 9 int a[4][4] , i , j ; 10 11 read(a) ; 12 exchange(&a[0][0]) ; 13 14 printf("output 4 * 4 array : \n"); 15 print(a , 4 , 4) ; 16 17 return 0 ; 18 } 19 20 int read(int a[4][4]) 21 { 22 int i , j ; 23 printf("please input array :"); 24 for(i = 0 ; i < 4 ; i++) 25 { 26 for(j = 0 ; j < 4 ; j++) 27 scanf("%d", &a[i][j]); 28 } 29 } 30 31 int exchange(int *p) //第 i 行与 第 j 列对调 32 { 33 int i , j , temp ; 34 for(i = 0 ; i < 4 ; i++) 35 { 36 for(j = 0 ; j < i ; j++) 37 { 38 temp = *(p + 4 * i + j); 39 *(p + 4 * i + j) = *(p + 4 * j + i); 40 *(p + 4 * j + i) = temp ; 41 } 42 } 43 } 44 45 int print(int *q ,int m , int n) 46 { 47 int i , j ; 48 for(i = 0 ; i < m ; i++) 49 { 50 printf("\n"); 51 for(j = 0 ; j < n ; j++) 52 { 53 printf("%d\t",*(q + m * i + j)); 54 } 55 } 56 printf("\n"); 57 }
标签: