为了进一步熟悉与指针有关的编程,这里给出一个指针综合的例子 :

编写一个函数,统计m行n列二维实型数组中整数,负数,零的个数

方法一:使用指向实型数组中正数,负数,零的个数

复制代码
 1 #include <stdio.h> 2  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 #include <stdio.h>
2
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 #include <stdio.h> 2  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 #include <stdio.h>
2
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 #include <stdio.h> 2  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 #include <stdio.h>
2
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 }

 
 
标签: 指针