[TOC]文章目录
目录
前言
本篇主要是针对网上学习C语言的数组部分的总结。如何储存学生的成绩?一行文字?一个矩阵?这就用到了数组。在运用数组时,我们要分清是对整个数组进行操作,还是对数组中的单个元素进行操作。
一、数组
数组的概念:一组具有相同数据类型的数据的有序集合。
数组中数据的特点:具有相同的数据类型;使用过程中需要保留原始数据
作用:数组是程序设计中最常用的数据结构,属于构造类型。它将相同类型的数据连续组合在一起,简化了命名和赋值过程。相较于单一的数据类型,能够更快更方便的处理更多的数据。
二、一维数组
一维数组的定义格式:类型说明符 数组名 [常量表达式] ;
说明:
- 类型说明符:数组的类型。
- 数组名命名规则和变量名相同,遵循标识符命名规则。
- 常量表达式可以包括常量和符号常量,但不能包含变量。
例如:int a[10];float b[10];char c[10];
例如: #define N 10
int a[N]; //数组的大小a为符号常量,通过宏定义的方式来实现。
- 常量表达式指明数组中元素的个数,必须大于零。
- 数组名后是用方括号而不是圆括号。
在这里可以回答前言中的问题,如:
存储学生成绩用实型数组 float score[31];
存储一行文字用字符数组 char str[50];
存储一个矩阵用实型数组 float a[3][4]; //这为二维数组,文章下面会讲到
其中: score、str、a为数组名
方括号内的数值为数组长度
下标个数为数组维数
·一维数组的初始化
在数组定义时为数组元素赋初值称为数组初始化
1、在定义数组时对数组元素赋以初值。
方法:将数组元素的初值依次放在一对花括号内。也可以单独赋值(繁琐)
例如:int a[2];
a[0] =1;
a[1]=2;
或 int a [10]={1,2,3,4,5,6,7,8,9,10}; //定义一个有十个元素的一维数组,花括号内的值为它的初值 。这些值按下标的顺序 存储形式如下:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
2、可以只给一部分元素赋值,其他按零来处理。
例如:int a [10]={0,1,2,3,4}; //表示只给前面5个元素赋初值,后5个元素值为0。
3、对全部数组元素赋初值时,可以不指定数组长度。
例如:int a [5]={1,2,3,4,5}; 也可以写成 int a [ ]={1,2,3,4,5};
char name[ ]="Alan"; 也可以写成char name[ ]={'A','l','a','n'};
4、一维数组赋初值的个数不能超过数组总元素的个数。
·一维数组的引用
C语言规定,只能引用单个数组元素,不能一次引用整个数组
数组元素的引用形式: 数组名[下标]
说明:
- 下标是指在数组中第几个元素
例如:a[3]就是数组中序号为3的元素,它和简单变量低位和作用相似。
- 下标可以是整型常量、整型变量和整型表达式。
例如:a[4]=a[o]+a[i+1];
- 下标的值是数组元素序号,从0开始,到n-1结束。
例如:int a[10];说明数组a有十个元素,分别为a[0],a[1],...,a[9]。
- 注意区分数组定义和数组元素引用
数组定义时有类型说明符
·一维数组的下标
数组的下标实际上是关于数组第一个元素的偏移量
比如,定义一个数组 a[5],它的第一个元素跟数组的第一个元素的偏移量为0.所以,数组的第一个元素应该是a[0]
数组的第二个元素跟数组的第一个元素偏移量为1,所以数组的第二个元素应该是a[1]
以此类推,数组的第五个元素与第一个元素的偏移量为4,所以数组a的第五个元素应该是a[4]
·一维数组的输入输出
可以对数组中任何一个元素进行单独的输入输出,每个元素等同于一个普通变量。
数组的引用离不开循环。将数组的下标作为循环变量,通过循环,就可以对数组的所有元素逐个进行处理。
数组的输入
#include<stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%d ",&a[i]);
.......
return 0;
}
数组的输出
#include<stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
printf("%d“,a[i]);
......
return 0;
}
·一维数组的遍历
将一维数组中的元素依次输出
#include<stdio.h>
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=0;i<10;i++)
{
printf(%d,a[i]);
}
}
三、二维数组
二维数组的一般形式为: 类型说明符 数组名[常量表达式1][常量表达式2];
其中:常量表达式1位行数;常量表达式2为列数。
注意:
- 一对方括号内不能写两个下标
- 数组元素个数必须是常量表达式,不能使用变量
例如: int i=4,j=5;
int a=[i][j]; //错误
- 用于定义数组长度的常量表达式必须为大于零的正整数
对于二维数组的理解:
二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。
例如, float a[3][4];可以把a看作一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组:
a[0]包含-----a[0][0] a[0][1] a[0][2] a[0][3]
a[1]包含-----a[1][0] a[1][1] a[1][2] a[1][3]
a[2]包含-----a[2][0] a[2][1] a[2][2] a[2][3]
·二维数组的存储
C语言中,二维数组中元素在内存中排列顺序是按行存放的。
float a[3][4] |
2000 | a[0][0] | 第一行元素 |
2004 | a[0][1] | |
2008 | a[0][2] | |
2012 | a[0][3] | |
2016 | a[1][0] | 第二行元素 |
2020 | a[1][1] | |
2024 | a[1][2] | |
2028 | a[1][3] | |
2032 | a[2][0] | 第三行元素 |
2036 | a[2][1] | |
2040 | a[2][2] | |
2044 | a[2][3] |
注意:用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
·二维数组的初始化
<1>分行给二维数组赋初值。(最清楚直观)
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
<2>可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
<3>可以对部分元素赋初值。
int a[3][4]={{1},{5},{9}}; //对应
1 | 0 | 0 | 0 |
5 | 0 | 0 | 0 |
9 | 0 | 0 | 0 |
也可以对各行中的某一元素赋初值。
int a[3][4]={{1},{0,0,7},{0,0,0,12}}; //对应
1 | 0 | 0 | 0 |
0 | 0 | 7 | 0 |
0 | 0 | 0 | 12 |
还可以只对某几行元素赋初值。
int a[3][4]={{1},{5,6}}; //对应
1 | 0 | 0 | 0 |
5 | 6 | 0 | 0 |
0 | 0 | 0 | 0 |
<4> 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如: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][ ]={1,2,3,4,5,6,7,8,9,10,11,12}; 因为没有规定列数,那么便可以第一行1个数,第2行8个数,第3行3个数,也是成立的。所以不可省略第二维的长度。
在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。
例如: int a[ ][4]={{1,2},{0,5,6},{0,0,11}};
·二维数组的引用
二维数组元素引用与一维数组元素引用一样,也要采用下标法
二维数组元素的引用形式: 数组名[下标1][下标2]
其中下标1和下标2可以是整型常量,整型变量和整型表达式。其编号从0开始。下标不要越界
例如:若 int a[2*4][3*3],i=10;
则使用 a[4][0],a[2][i-2]都是合法的
说明:数组名a代表的是数组a在内存中的首地址,可以用数组名a来代表数组元素a[0][0]的地址。
数组名是常量,不可对它赋值。
·二维数组的输入输出
二维数组的输入输出:采用双重循环方式进行。
二维数组的输入
#include<stdio.h>
int main()
{
int a[2][3],i,j; //变量i控制行下标,变量j控制列下标
for(i=0;i<2;i++) //当i等于0时,内循环实现的是对数组中第一行元素赋初值;当i=1时,....
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
......
return 0;
}
二维数组的输出
#include<stdio.h>
int main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%5d",a[i][j]);
......
return 0;
}
·二维数组的遍历
#include<stdio,h>
int main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d,",a[i][j]);
}
printf("\n");
}
return 0;
}
总结
本篇主要针对一维数组和二维数组的知识点进行了总结。