基礎知識
1.二維數組聲明:其中,整形常量表達式1表示第一維的大小(行數);表達式2表示第二維的大小(列數)。可以把a[i]看作特殊的一維數組名。
儲存類型 類型說明符 數組名[整形常量表達式1][整形常量表達式2]
2.二維數組儲存:在C語言中,二維數組是按行儲存的,占用的存儲空間大小為 sizeof(類型說明符)*行數*列數。
3.對於b[2][3][4],b是地址常量不能對其賦值;b指向b[0],b[0]指向b[0][0],b[0][0]指向b[0][0][0];b與&b[0]等價,b[0]與&b[0][0]等價,b[0][0]與&b[0][0][0]等價。
4.b+1表示序號為1的行地址;b[0]+1表示b[0]的1號元素(b[0][1])的地址。
5.假設數組float a[3][4]的起始地址為1000,則有如下等價關系:
- a, *a, a[0], *(a+0), &a[0], &a[0][0]地址值相等,為1000;
- &a[0][1], a[0]+1, *a+1地址值相等,為1004;
- a+1, a[1], *(a+1), &a[1], &a[1][0]地址值相等,為1016;
- a[1][0], *(*(a+1)+0)等價。
6.二維數組初始化:
- 子常量表相當於以為數組的初值,給出數據個數不能多余一行上元素的個數;
- 對部分元素賦初值,未被賦值的元素自動置0;
- 聲明有初值的數組時,可以不指定第一維的大小,由初值的個數確定。
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12}; int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int a[3][4] = {{1}, {5}, {9}}; int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a[][4] = {{0, 0, 1}, {5}, {0, 9}};
7.使用指針間接引用二維數組元素:一是直接指向數組元素;二是使用指針指向二維數組的行。
- 丟失結構信息
#include<stdio.h> int main(void) {
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p;
for(p=a[0];p<a[0]+12;p++) printf(“%d ”,*p); }
- 指針數組與數組指針
int (*p)[10] //數組指針 int *p[10] //指針數組
- 數組指針:p+i指向a的第i行元素起始地址;*(*(p+i)+j)==p[i][j]
#include <stdio.h> int main(void) { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},k; int (*p)[4]; for(p=a;p<a+3;p++) for(k=0;k<4;k++) printf(“%d ”,(*p)[k]); return 0; }
8.二維數組作函數參數
- 丟失結構信息
#include <stdio.h> int max_value(int *b,int n) { int k,max=*b; for(k=0;k<n;k++)
if(b[k]>max) max=b[k];
return(max); } int main(void) { int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}},max; max=max_value(a[0],12) ; /* 或*a或&a[0][0] */
printf(“The max value is %d\n”,max);
return 0; }
- 使用行指針變量
#include <stdio.h> int max_value(int (*array)[4])/*int array[3][4] 或 int array[ ][4] */ {
int j,k,max=array[0][0]; for(k=0;k<3;k++)
for(j=0;j<4;j++)
if(array[k][j]>max) max=array[k][j];
return(max); } int main(void) {
int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; printf(“The max value is %d\n”,max_value(a));
return 0; }
二維數組應用
1.矩陣轉置
#include <stdio.h> int main(void) { int i, j, a[2][3] = {{1, 2, 3}, {4, 5, 6}}, b[3][2]; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) b[j][i] = a[i][j]; printf("array a:\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("% 5d", a[i][j]); printf("\n"); } printf("array b: \n"); for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) printf("%5d", b[i][j]); printf("\n"); } return 0; }
2.矩陣乘積
#include <stdio.h> int main(void) { int a[2][3] = {1, 2, 3, 4, 5, 6}, b[3][4] = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6}, c[2][4] = {0}, i, j, k; for (i = 0; i < 2; i++) for (j = 0; j < 4; j++) for (k = 0; k < 3; k++) c[i][j] += a[i][k] * b[k][j]; for (i = 0; i < 2; i++, printf("\n")) for (j = 0; j < 4; j++) printf("% 4d", c[i][j]); return 0; }
3.計算3*3矩陣對角元素之和
#include <stdio.h> int matrix(int a[3][3]) { int sum = 0, i, j; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) if (i == j || i + j == 2) sum = sum + a[i][j]; return sum; } int main(void) { int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, count, i, j; count = matrix(a); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%d ", a[i][j]); putchar("\n"); } printf("%d\n", count); return 0; }