C语言---玩转数组

        我们在处理一些简单的数据时,用到的往往是简单的数据类型,例如:整形、浮点型、字符型等等,但是如果我们对于大量数据的处理,如果还要去一个个定义数据的类型或者说是单独处理时,就回十分麻烦。因此,人们就想着,在大规模的数据处理时,能不能将数据进行分类处理,如果将一组具有相同属性的数据进行批量的处理,这样就可以减轻人们的工作量,并且利用人们的理解。基于此种情形,数组就进入人们的视线中。

数组:一批具有同名的同属性的数据集合;

例如:将一个小组的每个成员进行编号,小组的名称成为A,小组的成员用A1,A2,A3···A10等代表。这十个成员就构成一个数组,数组名A就是确定这个数组的名称,用数组名+编号就是确定数组中的每一个元素,数组中每个元素都属于同一个数据类型,不能将不同的数据类型放在同一个数组中去。

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

        在数组的使用中,一维数组是最简单的,他的元素只要是数组名+下标就能够确定。 

1.1一维数组的定义

        要使用数组,就必须在程序中先定义数组,如同变量的使用;定义数组时,需要告知,有哪些数据成为数组,数组中有多少元素,属于那种数据类型。

        定义数组的一般形式:

      类型符  数组名 [常量表达式];

1、类型符:数组中所有元素的类型,如:int char;

2、数组名:为这些数组元素的集合起一个公共的名称,命名规则遵循标识符命名规则(数字、字母、下划线;不能以数字开头);

3、常量表达式:用来指定数组中元素的个数,包括常量和符号常量;

        一维数组到底什么?定义完一个一维数组究竟有什么作用呢?这应该是每个初学者的苦恼;一维数组是连续的一片空间,当你定义完一个一维数组时,计算机会安排一片连续的空间供你使用,可以在这一片空间中存放你的数据,不过这一片空间中的数据必须是同一种数据类型。  

         例如:定义一个整型变量a,计算机会给我们提供4个字节的空间去存放整型数据。而当我们定义一个数组长度为10的整型数组,计算机会给我们提供一片(40字节)的空间,每个数组元素4个字节,用来存放整型数据,而且这十个元素的空间是相连的,每个元素都有自己的名称,从arr[0]--arr[9],不存在arr[10];如上图所示。

1.2一维数组的初始化

        同变量一样,在进行定义同时给数组各元素进行赋值,这就是数组的初始化,数组的初始化方式有很多种,例如:

int arr[10]={1,2,3};//数组不完全初始化,其余元素赋初值为0;
int arr1[10]={1,2,3,4,5,6,7,8,9,0};//数组完全初始化;
int arr2[]={1,2,3};//在对全部元素赋值时,由于数据的个数已经确定,因此可以不用指定数组长度;
int arr3[3]={0};//让数组所有元素为0;
1.3一维数组的引用

        定义完数组后并对其进行赋值后,就可以引用数组的了,引用时,只能引用数组元素不能一次整体调用数组全部的值。引用数组的形式为:

        数组名[下标]

        例如:arr[0],代表数组中第一个元素,它和变量的作用相似;数组是使用下标来访问的,下标是从0开始的;

例如:输入十个整数,让其按逆序输出

#include <stdio.h>
int main()
{
    int arr[10];//定义一个长度为10的整型数组
    int i;
    printf("请输入十个整数:");
    for(i=0;i<10;i++)
    {
        scanf("%d",&arr[i]);//对数组元素arr[0]-arr[9]赋值
    }
    printf("这是个数的逆序输出为:");
    for(i=9;i>=0;i--)
    {
        printf("%d ",arr[i]);//输出arr[0]-arr[9]十个元素
    }
      return 0;
}

运行结果:

 1.4一维数组地址的查看

        数组中的元素是连续存放的,每一个元素都有自己的地址,这些地址也是连续的,现在创建一个数组,然后输出其地址,观察其是否连续;

#include <stdio.h>
int main()
{
    int arr[]={1,2,3,4,5,6,7,8,9,10};//定义整型数组
    int i =0;
    int sz=sizeof(arr)/sizeof(arr[0]);//计算数组长度,用数组的字节数除以一个元素的字节数
    for(i=0;i<sz;i++)
    {
        printf("&arr[%d]%p\n",i,&arr[i]);//输出每个元素的地址
    }
    return 0;
}

        运行结果如下,我们发现数组元素的地址是连续的 (计算机地址采用16进制进行划分)

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

        在实际应用中,二维数组也是广泛存在的,比如,有三个小组,每个小组四名同学。要把这些同学的成绩存放在数组中,这时就需要用到二维数组,如图所示。如果建立一个数组arr2,它应当是2维的,一维用来表示第几组,一维用来表示第几个学生;

         二维数组常被成为矩阵,如上图行与列的形式,有助于理解二维数组的结构,但是又不同于矩阵,不同点在于二维数组也是连续的,小组1的学生4与小组2的学生1是紧挨着的。

2.1二维数组的定义

        二维数组的定义形式为:

        类型符  数组名  [常量表达式] [常量表达式];

        其中,第一个常量表达式定义数组的行数,第二个常量表达式定义数组的列数;

         如:int arr [3][4];这是一个三行四列的二维数组,共有12个元素;这样的形式可以是我们将二维数组看作是特殊的一维数组,例如上图,将每个小组整体看作一个元素,整个二维数组就可以看作是长度为3的一维数组,数组元素分别为小组1、小组2、小组3。但其实每个小组有本身是一个一维数组,数组元素分别为学生1、学生2、学生3与学生4;

2.2二维数组的初始化

        二维数组初始化的方式也有多种,例如:

    int arr1[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};//全部初始化,按数组元素在内存中的排列顺序依次赋值;
    int arr2[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};//分行初始化,这种初始化方式很直观。
    int arr3[3][4]={{1,4},{5},{3,4,6}};//部分初始化,对每行元素进行部分初始化,没有赋值的按照0处理;
    int arr4[][4]={1,2,3,4,2,3,4,5,3,4,5,6};//如果对于全部元素赋初值,则定义数组时,可以对第一维数组长度不指定,但第二维数组长度不能省略。

运行结果如下

 2.3二维数组的引用

        二维数组元素的表示方式为:

        数组名[下标][下标]

         例如:arr[2][3]表示arr数组中序号为2的行中序号为3的列的元素,下标应该为整形表达式;下标的范围应在定义数组大小的范围之内。

2.4二维数组地址的查看

        二维数组也是通过下标使用。可以把二维数组理解为一维数组的数组;二维数组在内存中也是连续存放的,现在创建一个二维数组,然后输出其地址,观察其是否连续;

#include <stdio.h>
int main()
{
    int arr[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};//定义并初始化二维数组
    int i=0;
    for(i=0;i<3;i++)
    {
        int j=0;
        for(j=0;j<4;j++)
        {
            printf("&arr[%d][%d]%p\n",i ,j ,&arr[i][j]);//输出二维数组的地址
        }
    }
}

运行结果:

 二维数组在内存单元连续存放存放的理解:

 三、字符数组

        字符型数据在内存中是以字符的ASCII存储在存储单元的,一般占用一个字节,由于ASCII代码属于整数形式,因此字符类型也归纳为整型的一种,那如果是一串字符呢?

        在C语言中没有字符串的变量,字符串是存放在字符型数组中;

3.1字符数组的定义

        用来存放字符数据的数组就是字符数组,在字符数组中每个元素内存放一个地址;

        字符数组定义:

char [10];
c[0]='I',c[1]=' ',c[2]='L',c[3]='O',c[4]='V';
c[5]='E',c[6]=' ',c[7]='Y',c[8]='O',c[9]='U';

在内存中的存储方式:

 3.2字符数组的初始化

        字符数的初始化方式多种,例如:

char c1[10]={'I',' ','L','O','V','E',' ','Y','O','U'};//十个字符一次赋值;
char c2[10]={'I',' ','L','O','V','E',};//如果提供初值小于数组长度,其余元素自动定义空字符;
char c3[]={'I',' ','L','O','V','E',' ','Y','O','U'};//如果提供初值与预定数字长度一致,在定义时可以省略数组长度;

结果:

 3.3字符数组的引用

        引用字符数组中的一个元素,得到一个字符;

        输出一个welcome to xian;

代码

#include <stdio.h>
int main()
{
    int i;
    char c1[20]={'W','E','L',' C','O','M','E',' ',' T','O',' ','X','I','A','N'};
      for(i=0;i<20;i++)
    {
        printf("%c",c1[i]);
    }
    printf("\n");
    return 0;
}

结果:

 3.4字符串和字符串结束的标志

        在C语言中,字符串是按照字符数组来处理的,字符串的元素是逐个放在字符数组中的,C语言规定一个字符串结束的标志是'\0',如果字符数组中存在若干个字符前面有个字符都不是'\0',而第十个字符是'\0',则认为数组中有一个字符串,其有效长度为9个。C系统会在用字符数组存储字符串常量时自动加上'\0',作为结束标志。

        例如:代码:

        char c[]={"china"};

        在内存中存储的方式为:

         其数组长度为6,并不是5;所以系统在处理字符数组时,在遇到字符'\0'时,表示字符串结束,把他前面的字符组成一个字符串。

四、数组名与数组传参

        我们常说,数组名代表数组首元素地址;数组确实能表示数组首元素地址;但是有两个例外:

1、sizeof(数组名)这里表示数组名表示整个数组,计算的是整个数组的大小,单位是字节;

2、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

例如:

用代码区分数组名的含义:

#include <stdio.h>
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    printf("%p\n",arr);//数组名表示首元素地址,取出首元素地址;
    printf("%p\n",arr+1);//数组首元素的地址+1(第二个元素);
    printf("%p\n",&arr[0]);//直接取出首元素的地址;
    printf("%p\n",&arr[0]+1);//首元素地址+1;
    printf("%p\n",&arr);//取出数组的地址;
    printf("%p\n",&arr+1);//数组地址+1(数组结束后地址);
    int n=sizeof(arr);//数组的长度;
    printf("%d\n",n);
    return 0;
}

代码结果:

 图示说明:

 

         在二维数组中,特别注意的是,二维数组数组名表示一维数组的地址,即第一行的地址,数组名+1表示第二行的首地址;如下图所示:

 因此,在计算二位数组的行数与列数时有:

  sizeof(arr)/sizeof(arr[0])   // 计算行数,总数组大小/第一行的大小;
 sizeod(arr[0])/sizeof(arr[0][0])   //计算列数,第一行的地址/一个元素的大小

         数组传参时,1、传数组名arr;2、传数组元素arr[i];没有传arr[]这种形式;当作为数组名传参时,不符合上面两种情况,因此属于传首元素地址。

        总结,总的来说数组在C语言中属于很重要的部分,因此在学习时一定要充分理解其相应的原理,理解数组的地址,数组的空间分配,定义、初始化与引用。这次我们用了大量的图片来说明数组在内存中是如何存储数据的,大家一定要反复学习,理解其中真正的含义,然后再多加练习,这样才会有很大的收获。

        创作不易,还请大家多多点赞👍支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值