嵌入式第七课!难度爆表的——C语言数组!!

我们今天讲解的是数组,它是C语言提供的构造类型数据的其中之一。

数组

在数组中的元素遵循三条性质:

1.单一性:数组中的每一个元素都属于同一个数据类型。

2.连续性:数组中的连续元素所占的空间也是连续的。

3.有序性:按照下标的编号,越小的编号元素

一维数组

一维数组的定义方式

                              

“类型说明符” :指的是数组里元素数据的类型,比如说经常使用的有int型,float型等,但需要强调的是不能是空类型。

“数组名”:指的是数组的名字,和标识符的命名规则通用。

“[          ]”:在定义层,这是一个类型说明符,表示这是一个数组。

“ 常量表达式”:需要注意的是这是一个无符号整型常量。

一维数组的引用与初始化

我们表示数组元素的方式是:

这时,使用的“ [      ]”和定义层的用法不同,定义层是意在强调这是个数组,而在表示数组元素时,这是一个下标运算符,用来引用序号为“[ 里 ] ”的元素。

数组不可以被直接整体引用,或直接整体赋初值,如:a[10] = 10。C语言是通过去除变量名,留下类型名来进行格式检查的,这时检测会发生格式报错。

在数组名单独出现的时候,其代表的是数组首元素的首地址!注意不是数组的首地址哦

在定义数组的时候,数组长度为元素个数 * 元素类型的所占字节,而对数组里各元素进行赋值的时候,要记得数组下标的取值是[0,元素个数-1]

当我们给数组赋初值时,下标超过定义范围会导致越界,此时空间有可能会被别的变量使用,发生很严重的错误。

给数组元素赋初值有以下几种方法:

使用这种方法时注意不要越界

              

使用这种方法,剩下没有赋初值的元素均为0。

        

         

一维数组的各种应用

一维数组的逆序

#include<stdio.h>
int main (void)
{
    int i , t , len;
    int a[] = {1,2,3,4,5,6,7};
    len = sizeof(a) / sizeof(a[0]);

    for(i = 0 ; i < len / 2 ; ++i)
    {
        t = a[i];
        a [i] = a [len - 1 - i];
        a [len - 1 - i] = t;
    }
    for (i = 0 ; i < len; ++i)
    {
        printf("%d\n",a[i]);
    }
}

这个程序是用前后交换的方式,将元素逆序进行排列。交换次数为数组元素个数除以2,然后依次进行交换。定义一个 t 来保存交换前的数组元素。

运行结果如下:

一维数组的选择排序

int main (void)
{
    int a [] = {1,5,7,3,8,4,9};
    int i,j;
    int len,t;
    len = sizeof(a)/sizeof(a[0]);
    for (i = 0; i < len-1;++i)
    {
        for(j = i+1 ; j < len ; ++j)
        {
            if (a [i] > a [j])
            {
                t = a[i];
                a [i] = a [j];
                a [j] = t;
            }
            
        }
    }
    for (i = 0; i < len ; ++i)
    {
        printf(" %d ",a[i]);
    }
    printf("\n");
    return 0 ;
}

这种排序方式是用在不同的范围里分别求最小值,存放在前置,一轮循环只进行一次元素交换。

运行结果如下:

一维数组的冒泡排序

int main (void)
{
    int i,j,len;
    int a [] = {1,4,6,3,7,9,5};
    len = sizeof(a) / sizeof(a[0]);
    
    for (j = len - 1; j > 0 ; --j)
    {
        for (i = 0 ; i < j ; ++i)
        {
            if (a [i] > a [i + 1])
            { 
                int t;
                t = a [i];
                a[i] = a[i+1];
                a[i + 1] = t;
            }
        }
    
    }
    for (i = 0 ; i < len ; ++i)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

这种排序方式是利用2个相邻元素进行两两比较,小的元素数据放在前面,大的在后。每一轮有多个元素进行交换。

运行结果如下:

一维数组的插入法排序

int main(void)
{
    int a [] = {3,5,6,1,2,9,7};
    int len;
    len = sizeof(a)/sizeof(a[0]); 
    int b [len];
    b[0] = a [0];
    int i;
    for (i = 1 ; i < len ; ++i)
    {
        int j = i;
        int t = a [i];
        while(j > 0 && b[j - 1] > t)
        {
            b [j] = b [ j - 1];
            --j;
        }
        b[j] = t;
    }
    for (i = 0 ; i < len ; ++i)
    {
        a[i] = b[i];
    }

    for (i = 0 ; i < len;++i )
     {
        printf(" %d ",a[i]);
     }
    printf("\n");
    return 0 ;
}

这种方法是定义另一个空白的数组来进行存放排好顺序的原数组,后再重新赋值给原数字,达到给原数组重新排序的效果。

运行结果如下:

感谢你的阅读!如有遗漏和错误,请大佬在评论区进行批评指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值