C语言二维数组
基础知识
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; }
葡萄美酒夜光杯,欲饮琵琶马上催。