云计算百科
云计算领域专业知识百科平台

C语言(6)——数组

定义:数组是一组相同数据类型有限个数据的集合。

数组存储的性质:

  • 单一性:存储的数据类型相同。
  • 连续性:存储在一片连续的内存区域。
  • 有序性:按顺序存放数据。

一、一维整型数组

eg:int a[10]; 会开辟内存空间

形式:数据类型 数组名[元素的个数];

  • 数据类型:基础数据类型,不能是void
  • 数组名:字母、数字、下划线,不能以数字开头
  • 元素的个数:常量或常量表达式(以Windows为准,Windows只能识别常量,GNU gcc支持变量)

初始化:

//局部初始化,全部初始化为0
int a[5]={0};
//全部初始化,{1,2,3,4,5}称为初始化列表
int a[5]={1,2,3,4,5};
//局部初始化,剩下的补充0
int a[5]={1,2,3};
//默认初始化,系统根据输入的元素个数,开辟对应的数组空间
int a[]={1,2,3,4,5};

数组空间:基类型的空间大小*元素的个数。

  • 求元素个数:

len=sizeof(a) /sizeof(a[0]);

数组的类型:

int a[10];//数组a,类型为int[]
int b=10;//变量b,类型为int

数组访问:访问是对数组进行读或写的操作,下标值从0开始,到元素的个数-1。

  • 下标:常量、变量、表达式都可以。下标不能超出数组范围。

int a[5];
//定义数组,这里的[]为数组
a[0]=1;
//写,这里的[]为运算符,称为下标运算符
c=a[2];
//读

注意:整形数组不能整体输入输出。只能通过访问读写数组空间。

    数组的遍历操作:

    把数组中所有的元素依次访问,有且只有一次访问,一般需要配合循环使用(一维用一个for循环,二维用双层for循环)。

    int a[5]={0};
    int len = sizeof(a)/sizeof(a[0]); //获得数组元素的个数
    int i = 0 ;
    for(i=0;i<len;i++)
    {
    printf("a[%d]=%d\\n",i,a[i]);
    }

    二、二维整型数组

    二维整型数组由多个一维整形数组组成。

    形式:数据类型 数组名[行数][列数];

    eg:int a[3][5]; //a是一个二维数组,表示a里有三个元素,每一个元素是可以存储5个整型变量的一维整型数组。

    数据类型:a的类型为int[ ][ ],a[0]的类型为int[ ],a[0][0]的类型为int

    初始化:

    //全部初始化
    int a[2][3]={{1.2.3},{4,5,6}};
    int a[2][3]={1,2,3,4,5,6};
    //部分初始化
    int a=[2][3]={0};// 全部初始化为0
    int a=[2][3]={{1,2},{4}};// 剩下的部分补0
    //默认初始化
    int a=[ ][3]={{1,2,3},{1}};//只有前面的可以空,系统会根据输入的元素个数开辟空间

    存储空间:数组空间大小=基类型空间大小*行数*列数

    • 行数=sizeof( a )/ sizeof( a[0] );
    • 列数=sizeof( a[0] ) / sizeof( a[0][0] );

    三、一维字符数组

    一维字符数组用来存储字符串。

    形式:数据类型(char) 数组名[元素个数];

    • 数据类型:只能为char类型。
    • 元素个数:字符串必须以' \\0 '结尾,所以开辟空间除了字符的个数外,还需要一个' \\0 '的空间

    初始化:

    //全部初始化
    char str[6]={'h','e','l','l','o','\\0'};//输入单个字符后需加'\\0'
    char str[6]={“hello”};//用双引号括起来的为字符串,自带'\\0'
    char str[6]=“hello”;
    //部分初始化
    char str[10]={"hello"};//剩下的部分填'\\0',存储为ASCII码0
    //默认初始化
    char str[]={"hello"};//系统自动开辟6个空间

    访问:

    字符数组写入:

    //字符串整体写入,可以在初始化时整体写入
    char str1[20]={"hello"};
    //错误,字符串赋值不能整体赋值
    char str1[20]={0};
    str1={"hello"};

    • 整型数组不能整体操作,字符数组可以整体输入输出,但不能整体赋值。
    • scanf(“%s”,str);// str数组不用&取地址,因为数组( char[ ] )存储的就是单元格地址。

    四、二维字符数组

     由多个一维字符数组组成,可以存储多个字符串的数组。

    语法:char 数组名[行数][列数] ; (行,列,必须是整形常量)

    eg:char  strs[3][50];//strs中有3个元素,每个元素是一个可以存储50个元素的一维字符数组。

    类型:strs–>char[ ][ ]类型,strs[ ]–>char [ ]类型,strs[ ][ ]–>char类型

    初始化:

    char strs2[3][50]={0};// 常用,剩余的补0
    char strs3[3][50]={{0}};
    char strs[3][50]={"how","are","you"};
    char strs1[3][50]={{"how"},{"are"},{"you"}};
    //默认初始化,只有一维数可以空
    char strs4[][50]={"hello","are","you"};

    访问:

    • 读:依次输出一维数组a[i]

    //行数
    line = sizeof(strs)/sizeof(strs[0]);
    for(i=0;i<line;i++)
    {
    printf("%s\\n",strs[i]);//二维数组不能整体输出,只能依次输出一维数组
    }

    • 写:用strcpy函数赋值给一维数组a[i]

    strcpy(strs[0],"aaa");

    数组常用算法

    1. 倒置

    方法:把第一个数跟最后一个数交换,第二个数跟倒数第二个数交换……一共循环(len/2)次

    for(i=0;i<len/2;i++)
    {
    t=a[i];
    a[i]=a[len-1-i];
    a[len-1-i]=t;
    }

    2.排序

    排序:把一个数组按照特性规则(默认从小到大)进行排列位置。方便查找

    • 升序,从小到大
    • 降序 ,从大到小  

    2.1 冒泡排序

    方法:

    • 外层循环:每一次找到一个最大值,然后放到最后的对应位置。
    • 内层循环:相邻数字依次比较。

    for(j=len-1;j>0;j–) //外层循环执行(len-1)次
    {
    for(i=0;i<j;i++) //内层循环执行j次
    {
    if(a[i]>a[i+1])
    {
    t=a[i];
    a[i]=a[i+1];
    a[i+1]=t;
    }
    }
    }

    2.2 选择排序法

    方法:

    • 外层循环:每一次找到一个最小值,然后放到最前面的对应位置。
    • 内层循环:把第一个数依次跟后面的数比较。

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

    扩展一个随机数的头文件#include<stdlib.h>

    时间戳的头文件#include<time.h>

    随机数需要一个不断变化的参考点,这里以时间为参考点

    srand(time(NULL));
    r=rand();//随机给r赋值

    时间戳是计算机系统一个规定的时间,从1970年1月1日开始计时。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C语言(6)——数组
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!