栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言 —— 数组基础

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言 —— 数组基础

数组基础

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

数组元素必须连续存储


一、一维数组结构分析

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

    声明

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

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

    数组名

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

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

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

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

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

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

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


    注意事项:

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

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

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

    #include 
    
    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]);
    	}
    }
    

    数组单元

    int a[10];

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

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

    数组单元的声明a[索引]

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


    注意事项

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

二、初始化数组

未初始化数组

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

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

#include 

#define LENGTH 5
int a[LENGTH];

int main( void )
{
    for(int i=0; i 

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

#include 

#define LENGTH 5

int main( void )
{

  int b[LENGTH];
  for(int i=0; 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]; //错误 三、数组元素的操作

    输入,访问与遍历数组

    向数组元素输入值

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

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

    例:int example = a[5];

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

    例:

    for(i=0;i<10:i++)
    {
    	printf(“%d”,a[i]);
    }
    

    插入元素到数组 (前提:数组还有足够空间可供插入)

    插入尾部

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

    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;
    }
    

    从数组中删除元素

    删除尾部元素

    将最后一个元素赋值为 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];
    }
    
四、其他

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

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

    #include 
    
    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");
    }
    

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号