二维数组输入输出的归纳

二维数组类同于数学中的行列矩阵,第一维表示行,第二维表示列。对象与对象一类的问题大都可以抽象为二维数组来描述。

二维数组定义

数据类型 数组名[第一维大小][第二维大小];

int a[4][5];
float sc[3][4];

定义动态二维数组:

int n=2;
int a[n][3];
int b[2][n];

定义的数组未初始化时,数组内存储的时随机数;

int a[2][3];//该数组的六个元素为随机数

如果把二维数组看成特殊的一维数组,他每个元素就是特殊的一维数组。

int salary[3][4];

这是一个三行四列的二维数组,可以用该数组表示三个对象,所以将该数组看成三个一维数组,

三个对象分别是salary[0]、salary[1]、salary[2]

salary是数组名。
每个对象又是包含四个属性的一维数组,四个属性分别用
salary[i][0]、 salary[i][1]、salary[i][2]、salary[i][3];来表示。

二维数组名salary是salary[0]的地址,即salary=&salary[0]。
数组名+1表示跳过一个对象。
salary+1为第二个对象salary[1] 的地址,salary+2为第三个对象salary[2] 的地址。

PS.从数学行列式角度分析,二维数组名,即首行的地址,C语言中的地址一般是空间首地址。故二维数组名是首行首地址,该数组名+1,表示跳过一整行,达到第二行的首地址,并以此类推。

//写个程序验证一下子
#include<stdio.h>
int main()
{
   int sc[3][4];
   printf("sc=%p\n",sc);
   printf("&sc[0]=%p\n",&sc[0]);
   printf("&sc+1=%p\n",sc+1);
   printf("&sc+2=%p\n",sc+2); 
   return 0;
}

输出:
sc=000000000062FDF0
&sc[0]=000000000062FDF0
&sc+1=000000000062FE00
&sc+2=000000000062FE10

分析:
1)定义了一个三行四列的二维数组,三个对象,每个对象有四个属性;
2)二维数组名相当于首对象sc[0]的地址,即sc==&sc[0]。
输出的格式控制符为%p或%x或者%08x;
可以看到二维数组的首对象的地址是16进制数00062FDF0
3)二位数组名+1表示跳过一个对象(一行)的空间,到下一个对象(行) 的地址。即跳过一个对象的所有属性的空间,到下一个对象的起始位置。

例子中int型数组在devc++的每个属性占用四个字节,一个对象占用4*4=16个字节,故sc、sc+1、sc+2的地址相差16个字节。
4)程序每次运行时,由于起始地址的分配不同,所以输出结果会有不同。

二维数组的引用

二维数组的引用格式:

数组名[行下标][列下标];

注意:行下标和列下标均从0开始,同时要注意防止越界。

加个例子说一下:

#include<stdio.h>
int main (void)
{
    int a[2][3]; //先定义,后赋值
    int i,j,s=0;
    printf("Input 6 integers:");
    for(i=0;i<2;i++)  //行下标
    {
        for (j=0; j<3; j++)  //列下标
        {
            scanf ("%d",&a[i][j]); //勿忘 &
            s+=a[i][j] ; //与上一条语句不能颠倒
        }
    }
    for(i=0;i<2;i++)
    {
        for (j=0; j<3; j++)
            printf("%d\t",a[i][j]); //使用\t 的作用:向后跳四个空格,常用来做格线对齐
        printf ("\n"); //注意该输出换行符的位置
    }
    printf("s=%d\n", s);
    return 0;
}

运行结果:
Input 6 integers:1 2 3 4 5 6
1 2 3
4 5 6
s=21

二维数组的存储

二维数组在逻辑(逻辑)表现形式上可以理解为矩阵(分行分列),但是在内存中的物理存储又是连续的,即存完第一行,在后面继续存储第二行,第三行,…在这里插入图片描述

动态二维数组的应用举例
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int line,list;
    int **pary;
    int i,j;
    printf("Input the line:\n");
    scanf("%d",&line);
    printf("Input the list:\n");
    scanf("%d",&list);
    pary = (int **)malloc(sizeof(int *)*line);
    printf("Input the array:\n");
    for(i=0;i<line;i++)
    {
        pary[i] = (int *)malloc(sizeof(int)*list);
        for(j=0;j<list;j++)
        {
            scanf("%d",&pary[i][j]);
        }
    }

    for(i=0;i<line;i++)
    {
        for(j=0;j<list;j++)
        {
            printf("%d  ",pary[i][j]);
        }
        printf("\n");
    }

    for(i=0;i<line;i++)
        free(pary[i]);
    free(pary);
    return 0;
}

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值