C语言 —— 数组基础

数组基础

数组:用来存储一个固定大小相同类型元素的顺序集合

数组元素必须连续存储


一、一维数组结构分析

type arrayName [ arraySize ]; <类型> 数组名称[元素数量];

  1. 声明

    在 C 中要声明一个数组,需要指定元素的类型和元素的数量

    arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C 数据类型。
    举例:int a[12]; char name[23];

  2. 数组名

    int a[10]; int b[10];

    我们把变量a称为数组,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,指向第一个元素的地址,即a[0]。它的类型取决于数组元素的类型,如果数组元素是 int 类型,那么数组名的类型就是“指向 int 的常量指针”;如果它们是其他类型,那么数组名的类型就是“指向其他类型的常量指针”。(未学到指针的同学现阶段只用记住通常数组名单独拿出来是指数组的首个元素的地址)

    #include <stdio.h>
    
    int main( void )
    {
    	int num[23];
    	num[0] = 12;
    	printf("%d",*num);	//*是指针运算符,求某个内存地址中的数据。 
    }
    

    在这里插入图片描述

    注意:以下两种情况不被当做指针常量

    数组名作为 sizeof 操作符,sizeof返回整个数组的长度,而不是指向数组的指针的长度。

    #include <stdio.h>
    
    int main( void )
    {
    	int num[23];
    	num[0] = 12;
    	printf("%d",sizeof(num));	//int类型占四个字节,该数组23个元素,一共占23*4 = 92个字节 
    }
    

    在这里插入图片描述

    数组名作为单目操作符&的操作符,取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。


    注意事项:

    • 数组名只有在表达式中使用时,才会看成指针常量。

    • 数组名是指针常量,不是变量,无法修改(赋值,++,—),它所指向的是内存中数组的起始位置。所以数组名无法进行指针赋值。

    • 不能使用赋值符把一个数组的所有元素复制到另一个数组。必须使用一个循环,每次复制一个元素。(a=b;非法)

      #include <stdio.h>
      
      int main( void )
      {
      	int a[3] = {1,2,3}; //给a的三个元素分别赋值1,2,3 
      	int b[3];
      	//b = a;  非法,程序报错
      	for(int i=0; i<3; i++)
      	{
      		b[i] = a[i];
      		printf("%d",b[i]);
      	}
      }
      

      在这里插入图片描述

  3. 数组单元

    int a[10];

    数组的每个单元都是数组类型的一个变量

    使用数组单元时放在[ ]中的数字叫做下标/索引,索引从零开始计数

    数组单元的声明a[索引]
    在这里插入图片描述

    最大的索引 = 元素个数-1
    有效下标范围 [ 0,数组大小-1 ]


    注意事项

    有效的下标范围:编译器和运行环境不会检查数组的下标是否越界,一旦程序运行,可能会出现问题。

二、初始化数组

  • 未初始化数组

    未初始化的数组分为两种:

    全局数组:定义在main函数外面的数组,元素的默认值是全部为0

    #include <stdio.h>
    
    #define LENGTH 5
    int a[LENGTH];
    
    int main( void )
    {
        for(int i=0; i<LENGTH; i++)
    	{
            printf("%d ",a[i]);
        }
        printf("\n");
    
    }
    

    在这里插入图片描述

    局部数组:定义在函数内部的数组,其值默认是随机的.

    #include <stdio.h>
    
    #define LENGTH 5
    
    int main( void )
    {
    
      int b[LENGTH];
      for(int i=0; i<LENGTH; i++)
    	{
          printf("%d ",b[i]);
      }
    }
    

    在这里插入图片描述

  • 初始化数组
    可以逐个初始化数组

    a[0]=1; a[1]=4;

    可以使用一个初始化语句

    int a[5] = {1,2,3,4,5}float b[4] = {0.0};
    

注意事项

  • { }内数的数目不能大于[ ]的元素数目。
  • 省略[ ]中的数组大小,数组大小则为初始化时元素个数。例:int a[ ]={1,2,3,4,5,6}; //a为6个元素的数组
  • 把数组元素的第一个数组元素初始化为0,剩余的元素系统会自动初始化为0 例:int a[9] = {0};
  • 初始化的个数可少于数组元素个数,当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0;
  • 如果初始化个数大于数组元素个数,会产生error。
  • 初始化数组,数组元素必须是个常量,不能是变量。 int a=10; int b[a]; //错误

三、数组元素的操作

  1. 输入,访问与遍历数组

    • 向数组元素输入值

      例:scanf(“%d”,&a[1][3]);

    • 数组元素可以通过数组名称加索引进行访问

      例:int example = a[5];

    • 遍历数组:通过循环结构将数组内存储的一个个元素打印出来

      例:

      for(i=0;i<10:i++)
      {
      	printf(%d”,a[i]);
      }
      
  2. 插入元素到数组 (前提:数组还有足够空间可供插入)

    • 插入尾部

      找到数组最后一个元素索引

      int a[5]; a[0]=1; a[1]=2; a[2]=3;
      

      将新插入元素的索引+1

      a[3+1]=4;
      
    • 任意位置插入

      将该位置后所有元素位置向后移,可在该位置插入元素

      例:

      int a[12];	
      a[0] = 1; a[1] = 2; a[2] = 3;;a[5] = 6;   //将 4 插入 2 和 3 中
      
      for(i=5; i>0; i--)
      {
      	while(i != 1)
          {
      		 a[i+1] = a[i];
          }
      	a[2] = 4;
      }
      
  3. 从数组中删除元素

    • 删除尾部元素

      将最后一个元素赋值为 0

    • 删除任意位置元素

      删除该位置元素,该位置之后的所有元素向前移动

      例:

      int a[12];
      
      a[3]=1; a[4]=2;;a[6]=6;   //删除2
      
      for(i=4; i<6; i++)
      {
      	a[i] = a[i+1];
      }
      

四、其他

  1. 未初始化的局部数组的值为什么是随机的

    局部数组放在栈区,程序对栈的操作是入栈和出栈,当声明数组时,其实是在移动栈顶指针,给数组分配内存空间,而栈不会清空,给数组分配的空间里有残留的数据,这些数据是上一次出栈时候遗留的数据,所以数据是随机的。

    #include <stdio.h>
    
    void test();
    int main()
    {
        test();
        test(); //重复一次
    }
    
    void test()
    {
        int a[5];
        for(int i=0; i<5; i++)    //第一次打印未初始化的数组
        {
            printf("%d ",a[i]);
        }
    
        printf("\n");
        for(int i=0; i<5; i++)    //给数组赋值
        {
            a[i] = i;
        }
    
        for(int i=0; i<5; i++)    //再次打印
        {
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    

    在这里插入图片描述

    当我们连续两次调用一个函数的时候,发现只有第一次的值是随机的。因为我们两次进行了对栈的相同操作,首先我们在栈上给数组分配空间,此时所得到的是上一次程序运行残留下来的数据,是随机值,然后进行元素赋值,此时我们已经对栈进行了修改,所以第二次打印的出来的是修改后的值。第一个函数调用完毕,弹出栈,栈帧切换。第二次在调用该函数,再次为数组分配空间,我们第一次函数对栈的修改并没有被栈清空,所以第二次的随机值就是第一次最后的数据了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值