C语言数组总结(基本概念、一维数组、二维数组和多维数组)

一、学习目标

  • 掌握一维数组,二维数组的定义,初始化和数组元素的引用

  • 掌握字符数组的定义,初始化和数组元素的引用

  • 掌握字符串的存储方式和应用

  • 掌握有关处理字符串


【问题】从键盘接收10个数,求平均数并输出所有小于平均数的数

【分析】从键盘接收10个数,求平均数很简单,可以采用边接收边求和的方法,最后根据综合求平均数。下面的程序可以做到:


int a;
float s;
for(i=0,s=0;i<10;i++)
{
    scanf("%d,&a");
    s = s + a;
}

平均数就是S/10了,但是输出小于平均数的数就比较麻烦了,因为从键盘接收的10个数在求和以后没有保存起来,输出比平均数小的数已经无法实现。要解决此问题,必须将10个数存储下来,而利用数组就可以解决这个问题。


二、数组的基本概念

所谓数组,就是一组类型相同的变量。它用一个数组名标识,每个数组元素都是通过数组名和元素的相对位置——下标来引用的。数组可以是一维的,也可以是多为的。

观察以下系列变量:


int a1,a2,a3,…,a10

这是一组int类型变量,可以定义以下数组来代替这些变量:


int a[10];

这就是数组,该元素包括以下元素:


a[1],a[1],a[3],…,a[9]

其中下标从0开始,和前面不同的是,这些变量统一共享一个数组名a。

下面具体研究。


1.一维数组

一维数组用于存储一行或一列的数据。定义方式如下:

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

<类型>:数组元素的数据类型,可以是int,char,float等简单类型,以及后面我们要学到的结构体,共用体等复杂类型。

<数组名>:数组的标识,命名规则同变量名。

<常量表达式>:用于定义数组的长度,因为数组也必须先定义后使用

例如:


int a[10];
char s[100];

定义数组时需要注意:

(1)C语言不允许对数组的大小作动态定义,即定义行中的数组长度可以包括常量和符号常量,但不能包括变量。例如,下面的定义是错误的。


int n=10;
int a[n];    /*因为n为变量*/

而下面的定义是正确的:


#define N 10
void main()
{
    int a[N];
    ……
}

(2)定义数组 的同时可以对数组初始化。以下初始化的方法都是允许的:


int a[10]={1,2,3,4,5,6,7,8,9,10};    //全部元素都初始化
int a[]={1,2,3,4,5,6,7,8,9,10};    //全部元素都初始化,可以省略长度说明
int a[10]={1,2,,4,5};    //部分元素a[0],a[1],a[3],a[4]初始化

使用数组时需要注意:

(1)数组元素的下标从0开始。


int a[10];

则自然计数的第i个元素是:a[i-1],例如第5个元素是a[4]。有的书上也称第一个元素为第0元素,这种说法将会导致歧义,a[4]变成第4元素,但不是第4个元素。

n个元素的数组,其最大下标是n-1,如上面的数组,最后一个元素是a[9],不存在a[10]这个元素。

(2)数组名不能像变量一样进行赋值操作。以下用法是错误的:


int a[10],b[10];
a=b;    //错误

下面是常见的一维数组的定义:


int a[10];    /*定义整形数组a,它有10 个yuansu*/
char s[20];    /*定义字符型数组s,它有20 个元素*/
float f[5],g[10];    /*定义实型数组f和g,f数组有5个元素,g数组有10个元素*/

【例题1】

编程求10个数中的最大值,最小值,平均值。输出所有小于平均值的数。


#include 
void main()
{
    int a[10],i;
    int max,min;
    float s=0,average;
    printf("Input 10 numbers: ");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    s = max = min = a[0];
    for(i=1;i<10;i++)
    {
        if (a[i]>max)
            max=a[i];
        else
            if(a[i

运行后输入68 88 95 75 82 95 56 76 86 92<回车>,程序的结果如下所示。


Input 10 numbers:68 88 95 75 82 95 56 76 86 92
max is 95
min is 56
averagr is 81.30
68 75 56 76

程序中先将a[0]的值赋给max,然后利用for循环将剩余9个元素逐个与max比较,如果发现比max大的元素,则用该元素的值替换max,从而保证max总是最大值。

计算出平均值aver后,再把数组中的10个元素与aver逐个比较,输出其中小于平均值的数。

程序中的变量aver可能是小数,定义的类型不能是int类型。s可以定义成int类型,过如果定义成int类型,语句aver=s/10;需要写成aver=s/10.0;,因为s/10是整除了。通过上面的程序可以看出,数组的最大优点就是:下标可以是变量甚至是表达式,从而给访问和操作一组变量带来了极大的方便。


2.二维数组和多维数组

二维数组用于存放矩阵形式的数据,如二维表格等数据。

定义二维数组的格式如下:

<类型> <数组名> [<常量表达式1>] [<常量表达式2>];

例如:


int a[3][4];    //3x4的矩阵,共12个元素
float f[5][10];

以上和一维数组相似,定义了一组变量,只不过这些变量有行和列的排序。如int a[3][4]的排列如下:


a[0][0]    a[0][1]    a[0][2]    a[0][3]
a[1][0]    a[1][1]    a[1][2]    a[1][3]
a[2][0]    a[2][1]    a[2][2]    a[2][3]

以上是便于理解和引用的逻辑排列结构,在计算机的内存中,其物理存储结构会因为系统不同而不同,例如下图的物理存储结构。

C语言数组总结(基本概念、一维数组、二维数组和多维数组)_第1张图片

二维数组内存存储示意图

注意图中每个元素占4个字节的存储空间,这是因为32位机器的int型的长度为4字节,如果是16位机器就是2个字节了,不同类型不同机器每个元素的长度不一样。

二维数组的初始化可以有:


int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};    /*完全初始化*/
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};    /*省略行的完全初始化*/
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};    /*分行完全初始化,可读性较好*/
int a[3][4]={1,2,3,4};    /*部分初始化*/

引用二维数组元素的方法与一维数组类似,只不过多了一个下标。


【例题2】

  演示二维数组的定义及元素引用


#include 
void main()
{
    int i,j,k=0;
    int a[3][4];
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++)
        {
            a[i][j]=k;
            printf("a[%d][%d]=%d\t",i,j,a[i][j]);
            k++;
        }
    }
    printf("\n");
}

程序的运行结果如下所示:


a[0][0]=0       a[0][1]=1       a[0][2]=2       a[0][3]=3
a[1][0]=4       a[1][1]=5       a[1][2]=6       a[1][3]=7
a[2][0]=8       a[2][1]=9       a[2][2]=10      a[2][3]=11       
Press any key to continue

【例题3】

输入3位学生的计算机,数学成绩,计算每门课程 的平均分。


#include 
void main()
{
    float score[3][2],average[3],temp;
    char info[2][10]={"Computer","English"};
    int i,j;
    for( i = 0 ; i < 3 ; i++ )
    {
        printf("No:%d\n",i+1);
        for( j = 0 ; j < 2 ; j++ )
        {
            printf("%s:",info[j]);
            scanf("%f",&score[i][j]);
        }
    }
    for(i=0;i<2;i++)    /*课程循环*/
    {
        temp = 0;
        for(j=0;j<3;j++)
            temp = temp + score[j][i];    /*j学生的i课程成绩*/
        average[i] = temp / 3;
        printf("%s:%.2f\n",info[i],average[i]);
    }
}

程序的运行结果如下所示。


No:1
Computer:90
English:85
No:2
Computer:82
English:88
No:3
Computer:68
English:73
Computer:80.00
English:82.00
Press any key to continue

二维数组的引用需要两重循环来分别控制行和列,程序中需要注意行和列的关系。

上面程序中定义和使用了字符型数组char info[3][10],下一节将详细介绍。


作者主页: 正函数的个人主页
文章收录专栏: C语言

欢迎大家点赞 收藏 ⭐ 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!

你可能感兴趣的:(C语言,c语言)