C语言基础 -47 函数_函数与二维数组

book@100ask:~/C_coding/CH02$ cat 2_arr.c 
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 4

int main()
{
	int i,j;
	int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
	
	for(i = 0; i < M; i++)
	{
		for(j = 0; j < N; j++)
		{
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	exit(0);
}
book@100ask:~/C_coding/CH02$ make 2_arr
cc     2_arr.c   -o 2_arr
book@100ask:~/C_coding/CH02$ ./2_arr
   1   2   3   4
   5   6   7   8
   9  10  11  12

二维数组:典型的列指针

book@100ask:~/C_coding/CH02$ cat 2_arr.c 
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 4

void print_arr(int *p,int n)
{
	int i;
        for(i = 0; i < n; i++)
	{
        	printf("%4d",p[i]);     //将当前二维数组当作一个大的一维数组进行输出
	} 
        printf("\n"); 
}

int main()
{
	int i,j;
	int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
	
	print_arr(&a[0][0],M*N);   // *a a[0]  *(a+0)

	exit(0);
}
book@100ask:~/C_coding/CH02$ make 2_arr
cc     2_arr.c   -o 2_arr
book@100ask:~/C_coding/CH02$ ./2_arr
   1   2   3   4   5   6   7   8   9  10  11  12
book@100ask:~/C_coding/CH02$ cat 2_arr.c 
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 4

void print_arr(int (*p)[N],int m,int n)     //一个指针* 等价于一个方括号,但第二维不可省略。
//void print_arr(int p[][N],int m,int n)
{
	int i,j;

	printf("sizeof(p) = %d\n",sizeof(p));   //形参位置无论定义为数组还是指针,sizeof(p)恒等于8

	for(i = 0; i < m; i++)
	{
		for(j = 0; j < n; j++)
		{
        		printf("%4d", *(*(p+i)+j));
//               printf("%4d", p[i][j]);
		}
		printf("\n");
	} 
}

int main()
{
	int i,j;
	int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};

	printf("sizeof(a) = %d\n",sizeof(a));	
	print_arr(a,M,N);

	exit(0);
}


book@100ask:~/C_coding/CH02$ make 2_arr
cc     2_arr.c   -o 2_arr


book@100ask:~/C_coding/CH02$ ./2_arr
sizeof(a) = 48      //由于是整型,12个元素,每个元素4字节,因此此处输出48
sizeof(p) = 8       //指针每个元素占8字节,64位系统
   1   2   3   4
   5   6   7   8
   9  10  11  12

book@100ask:~/C_coding/CH02$ cat 2_arr.c 
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 4


float average_score(int *p,int n)
{
	int i;
	float sum = 0;

	for(i = 0; i < n; i++)
		sum += p[i];

	return sum/n;    //求平均值
}

int main()
{
	int i,j;
	int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
	float ave;

	ave = average_score(*a,M*N);

	printf("%f\n",ave);
	
	exit(0);
}


book@100ask:~/C_coding/CH02$ make 2_arr
cc     2_arr.c   -o 2_arr


book@100ask:~/C_coding/CH02$ ./2_arr
6.500000

假定行位学生,列位对应每行(不同学生)的成绩。 

book@100ask:~/C_coding/CH02$ cat 2_arr.c 
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 4


float average_score(int *p,int n)
{
	int i;
	float sum = 0;

	for(i = 0; i < n; i++)
		sum += p[i];

	return sum/n;
}

void find_num(int (*p)[N], int num)
{
	int i;
	for(i=0; i<N; i++)
	{
		printf("%d ",*(*(p+num)+i));   //(p+num):move num rows,  +i: move i colums
	}
	printf("\n");
}

int main()
{
	int i,j;
	int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};
	float ave;
	int num=1;

	ave = average_score(*a,M*N);

	printf("%f\n",ave);

	find_num(a,num);	

	exit(0);
}
book@100ask:~/C_coding/CH02$ make 2_arr
cc     2_arr.c   -o 2_arr
book@100ask:~/C_coding/CH02$ ./2_arr
6.500000    //平均值
5 6 7 8     //对应第1行的成绩

如果不区分行列,则传指针过来。float average_score(int *p,int n)

如果区分行列,则将行指针传递过来:void find_num(int (*p)[N], int num)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章