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)

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