C语言——指针与函数

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

编写一个函数,统计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 }

posted @ 2011-08-15 18:17  MATRIX | yan  阅读(611)  评论(0编辑  收藏  举报