为了进一步熟悉与指针有关的编程,这里给出一个指针综合的例子 :
编写一个函数,统计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 }
标签:
指针
转载于:https://blog.51cto.com/699794/925328