C语言新手小白详细教程(5)数组

希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~


开篇说明

截止目前,我们学习并使用的变量都属于基本类型,且都是单独使用,但有时,我们会有存储批量数据的需求。如,统计100名同学的身高与体重,按照之前的方法,我们需要定义100个int型变量,分别来存储身高,体重,非常繁琐。因此,我们引入数组来解决这个问题。


一.一维数组的定义与引用


我们要如何理解定义数组呢
其实很简单,就是和计算机要一块连续的空间,并且告诉计算机,这块空间会存储哪种类型的数据。


1.定义一个一维数组

我们首先需要和计算机进行交流,来告诉计算机,我们需要一块多大的连续空间,用来存储哪种类型的数据

结构为:数据类型 数组名[常量表达式];
1.数据类型:就是和计算机申请空间时,需要告诉计算机要存储的数据类型;所以,你申请的这块空间,只可以存储一种类型。
2.数组名:就是你给你自己申请的空间来命名。
3.常量表达式:就是一个确定的数字,例如,1,5,8,10。这些都是确定的数字。
例:

int counts[9];//9个连续的空间,每个类型都是int型,数组的名字叫counts

char sex[2];//2个连续的空间,每个类型都是char型,数组的名字叫sex

2.引用一维数组内的元素

当我们向计算机申请了一片连续的空间之后,我们就要使用这些空间。
结构为:数组名字[下标];
下标:就是数组中连续空间的相对位置,从0开始 依次递减。
例如 我们定义int counts[9];数组大小为9,那么空间的相对位置就是0、1、2、3、4、5、6、7、8;那么使用第一个位置的方法就是 counts[0]、使用第二个位置的方法就是 counts[1],依此类推…
这里需要注意的是:我们只能分别引用单个数组元素,不能一次性调用整个数组。


3.一维数组内的初始化

我们在和计算机申请时,就给让申请的这块空间来放置一些元素
1.定义时给全部空间初步赋值。
int counts[5] = {1,2,3,4,5};
这里需要注意的是:你申请的空间是连续的,那么赋值时也是按照相对位置顺序进行放置,用逗号来隔开,用花括号括起来,最后用分号结尾就可以了。
2.只给一部分值
int counts[5] = {1,2};
这里我们申请了五个空间,但是我们只给两个空间赋值,那么剩余的三个空间会自动赋值0.
3.不指定数组长度
int counts[ ] = {1,2,3,4,5};
如果我们没有指定数组长度,计算机会根据后面花括号中数据的个数自动设置数组长度。所以这里数组counts的长度为5.


4.举个例子

申请一个大小为10的int型数组,名字为counts,10个位置分别赋值1、2、3、4、5、6、7、8、9、10;然后依次输出。

这里我们先使用循环来做这个问题

#include <stdio.h>

int main(void) {
    // 申请一个大小为10的int型数组,名字为counts
    int counts[10];
    int i;
    
    for (int i = 0; i < 10; i++) {// 循环变量i从0到9,共循环10次
        counts[i] = i + 1;
    }
    // 依次输出
    for (int i = 0; i < 10; i++) {
        printf("%d ", counts[i]);
    }
    printf("\n");
}

输出结果是这样子的:
在这里插入图片描述


那么我们如果不使用循环会怎么样呢?

#include <stdio.h>

int main() {
    int counts[ ] = {1,2,3,4,5,6,7,8,9,10};
    printf("%d ", counts[0]);
    printf("%d ", counts[1]);
    printf("%d ", counts[2]);
    printf("%d ", counts[3]);
    printf("%d ", counts[4]);
    printf("%d ", counts[5]);
    printf("%d ", counts[6]);
    printf("%d ", counts[7]);
    printf("%d ", counts[8]);
    printf("%d ", counts[9]);

    return 0;
}

输出结果还是一样 但是代码的美观性却很差了,而且我们使用循环可以更好的拓展数组,如果数组长度变为100,我们只需要改变循环即可,而不需要一个一个修改。并且我们使用循环,可以更简洁直观。效率更好
在这里插入图片描述


二.二维数组的定义与引用

我们经常使用的表格其实就是二维数组,在数学中又被称之为矩阵。


1.定义二维数组

我们需要和计算机进行交流,告诉计算机,你需要一块多大的连续空间,这片空间被分为M行N列,来存储同一类型的数据。

结构为:数据类型 数组名[常量表达式1] [常量表达式2];

  1. 数据类型:和一维数组一样,一个二维数组只可以存储一种类型的数据;
  2. 数组名:为你申请的这块空间起一个名字。
  3. 常量表达式1:二维数组的行数;
    常量表达式2:二维数组的列数;
    所以,整个数组的大小为,行数 * 列数;

2.引用二维数组内的元素

当我们成功向计算机申请了一片连续的空间之后,我们就要开始自主的使用这块空间

结构为:数组名字[行下标] [列下标];
行下标 & 列下标:和日常使用的表格是一样的概念,你要引用的位置在第几行第几列,行和列都要从0开始依次递增。
比如,int table[3] [3];这相当于我们申请了一个类型是int型,大小为3行3列的二维数组。


3.一维数组内的初始化

我们在和计算机申请时,就给让申请的这块空间来放置一些元素
1.分行给二维数组赋初值,例如:
int tables[3] [3] = {{1,2,3},{4,5,6},{7,8,9}};
计算机会将第一个花括号内的数据给第0行,第二个花括号内的数据给第一行,第三个花括号内的数据给第二行。
2.所有数据写在一个花括号内,计算机自动依次赋值,例如:
int tables[3] [3] = {1,2,3,4,5,6,7,8,9};
二维数组是顺序的一块空间,所以计算机会按照你给的数据顺序依次赋值这些空间。
3.对部分元素进行赋值,例如:
(1) int tables[3] [3] = {{1},{4},{7}};
赋值方法如下:三个花括号分别对应 0 1 2 行,再结合一维数组中部分赋值的知识,我们可以知道,支队每一列的第一个元素来进行赋值,其他补零即可。
二维数组形式如下:
在这里插入图片描述

(2)int tables[3] [3] = {{1},{4,0,6},{7}};
在这里插入图片描述
4.只指定其中一个维度,另外一个维度通过赋值让计算机自动计算,例如:
int tables[ ] [3] = {1,2,3,4,5,6,7,8,9};
一共九个数据,第二维度即列是3,那么行自然也是3:


4.举个例子

定义一个3行4列的二维数组A,从键盘输入一个整数T,A数组的值为T乘以当前行下标和列下标之和。转置这个二维数组,转置后的数组为B,分别输出原数组和转置后的数组B。

#include <stdio.h>

int main() {
    int A[3][4];
    int B[4][3];
    int T, i, j;
    // 从键盘输入一个整数T
    printf("请输入一个整数T: ");
    scanf("%d", &T);
    // 计算数组A的值
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            A[i][j] = T * (i + j);
        }
    }
    // 输出原数组A
    printf("原数组A:\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d\t", A[i][j]);
        }
        printf("\n");//每次打印完一行后,换行
    }

    // 转置数组A到数组B
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            B[j][i] = A[i][j];
        }
    }
    // 输出转置后的数组B
    printf("转置后的数组B:\n");
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 3; j++) {
            printf("%d\t", B[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出结果是这样子的:
在这里插入图片描述


意气风发,漫卷疏狂
学习是成长的阶梯,每一次`的积累都将成为未来的助力。我希望通过持续的学习,不断汲取新知识,来改变自己的命运,并将成长的过程记录在我的博客中

如果我的博客能给您带来启发,如果您喜欢我的博客内容,请不吝点赞、评论和收藏,也欢迎您关注我的博客。
您的支持是我前行的动力。听说点赞会增加自己的运气,希望您每一天都能充满活力!

愿您每一天都快乐,也欢迎您常来我的博客。我叫意疏,希望我们一起成长,共同进步。
logo
我是意疏 下次见!

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值