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)