【C上分之路】第五篇:数组的定义、初始化方式,查询元素

冲鸭

数组

数组是由数据类型相同的一组数据组成,数组中每一个数据都叫做数据元素,数组所包含的数组个数称为数组长度,数组中的每一个元素都一个对应的序号或者位置,这个序号从0开始,这个序号也叫做下标

数组的定义

要使用数组时,通过声明数组告诉编译器数组中含有多少元素和这个元素的原型

定义形式:data_type ArrayName[length]
data_type:数组元素的数据类型
ArrayName:定义的数组名
length:数组长度,可以为整型常量表达式

数组的初始化

若数组未进行初始化,则数组元素和未初始化的变量一样,其中存储的都是垃圾值,所以使用数组之前必须进行初始化,编译器使用的是内存相应位置上的值

根据数组对元素初始化的位置和数量可以分为全部初始化、部分初始化、指定初始化

全部初始化

全部初始化是传统的C初始化语法,必须初始化最后一个元素之前的所有元素,即对元素进行逐一赋值,不能对数组进行整体赋值

int a[5] = {11,22,33,44,55};	//正确,全部进行逐一赋值
int b[5] = 1;			//错误,不能进行整体赋值

全部初始化一个数组时,可以在声明定义的时候不指定数组的长度,编译器会根据数组元素来推断出数组的长度

编译器根据元素决定大小

部分初始化

当初始值个数小于数组元素个数时,只给数组前面部分元素赋值,剩余的部分都会初始化为0

数组部分初始化

指定初始化

C99增加了一个特性:指定初始化器,可以初始化指定的数组元素

指定初始化

若定义时没有指定数组长度进行指定初始化,则编译器会把数组的大小设置为足够装得下初始化的值

编译器根据元素决定大小

数组的边界

数组在内存中连续的,数组元素之间都是在连续的地址上存储的

数组边界确定了数组下标的取值范围,但是使用数组时必须要确保数组的下标是有效的值

数组越界就是数组下标超出了数组边界,访问到其他地址上的垃圾值,但是编译器并会检查下标是否在数组的有效范围内,这样的检查会降低程序的运行速度,C标准建立的一个核心理念就是相信程序员,相信程序员在使用数组不会引发数组越界的行为,所以使用数组时要确保下标值是有效值

数组越界值和地址2

二维数组

二维数组的定义形式:data_type array_name[length1][length2]
可将二维数组看做表格,length1当做表格的行,length2当做表格的列
要在数组中定位某个元素,则必须指明行列的下标

线性内存中存放二维数组的形式有两种,一种是按行排列,另一种按列排列

  1. 按行排列:先存放一行元素之后,然后再存放第二行元素,横向存放
  2. 按列排列:先存放一列元素之后,然后再存放后续列的元素,纵向存放
二维数组分布

在C语言中,二维数组是按上图所示进行行排序,二维数组在概念上是二维的,但是在内存中是连续存放的

二维数组

二维数组的初始化

初始化二维数组是建立在初始化一维数组的基础上,可以在这个基础对二维数组进行不同方式的赋值

分段赋值

二维数组可以看做是由两个一维数组嵌套而成,可对两个数组进行分段赋值:即第一个数组作为一个整体初始化,然后再将第二个数组进行整体初始化

int a[2][3]={{2,3,6},{4,5,7}};

连续赋值

二维数组是在内存中连续的,只要在元素范围之内就可以进行连续赋值

int a[2][3]{2,3,6,4,5,7};

静态数组

数组根据能否改变容量大小将数组分为静态数组、动态数组

静态数组:数组被定义之后,分配的内存空间是固定的,之能读写数据元素,不能对元素进行增删的操作

动态数据:数组在定义之后可以改变数组容量,允许在数组内的随意位置对元素进行增删操作

在C标准中,数组时静态数组,数组的大小一旦定义之后就不能进行改变,若要对数组在指定位置进行增删操作,那需要在内存中重新开辟空间,这会很大程度上影响程序性能和消耗资源

若要对数组进行增删,只能将要操作的数据放入至一个新的数组

数组查询元素

C标准库中没有提供与数组查询相关的函数,数组查询就是将查询的值与数组元素挨个比较

#include <stdio.h>
int main()
{
    int a[10] ={ 3,9,9,9,7,2,8,4,6,9};
    int b[10];
    int num,flag = -1,count = 0;
    printf("输入要查找的数字(1~9):");
    scanf("%d",&num);
    for(int i=0;i<10;i++)
    {
        if(a[i] == num)
        {
            flag = i;
            count++;
            for(int j = 0;j<count;j++)
            {
                b[count-1] = flag;
            }
        }
    }
    if(flag>=0){
        for(int k = 0;k<count;k++)
        {
            printf("从数组中第%d次查询到了%d,下标为:%d\n",k+1,num,b[k]);
        }
    }else{
        printf("在数组中查询不到%d\n",num);
    }
    return 0;
}
数组查询元素

总结

数组是一系列相同类型的数据集合,简单介绍了数组的定义以及初始化方式,访问数组元素可以通过下标进行访问,以及对某个元素的查询

赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请各位大佬帮忙指正,如果觉得有帮助就点个赞当作对我的一个小肯定❤,peace&love

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值