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;
}

 

posted @ 2021-05-19 15:46  结城梨斗  阅读(1744)  评论(0编辑  收藏  举报