
可以说,数组是迄今为止存储数据的第一个实际结构. 尽管较早学习的变量也可以存储数据,但是变量可以存储的数据非常有限. 不仅如此,数组和指针(将在后面讨论)是互补的,学习数组可以为学习指针奠定基础.
那么数组到底是什么?顾名思义,数组是许多数字的组合!那么对这些数字有什么要求,不管什么数字组合在一起,它都是一个数组吗?存储在同一数组中的数字必须满足以下两个条件: 这些数字的类型必须相同. 这些数字必须连续存储在内存中.
换句话说,数组是连续存储在内存中的相同类型数据的集合.
一维数组一维数组的定义如下:
类型说明符数组名称[常量表达式];
示例:
int a[5];
这意味着定义了一个整数数组,数组名称为a,定义的数组称为数组a. 数组名a不仅表示数组,而且还表示数组的第一个地址(该地址暂时不讨论,稍后将讨论指针).
这时,数组a中有5个元素,每个元素都是一个int变量,并且它们在内存中的地址是连续分配的. 也就是说,int变量占据4个字节的内存空间,然后5个int变量占据20字节的内存空间,并且它们的地址被连续分配.
这里的元素是变量的含义,而数组中的元素在传统上称为元素.
定义数组时,需要指定数组中元素的数量. 方括号中的常量表达式用于指定元素的数量. 数组中的元素数也称为数组的长度.

由于数组中有多个元素,如何区分这些元素?该方法是通过对每个元素编号. 数组元素的数量也称为下标.
数组中的下标从0(而不是1)开始. 那么,如何用下标表示每个数组元素呢?通过“数组名[下标]”方法. 例如,“ int a [5];”表示定义了一个包含5个元素的数组a,这5个元素是[0],[1],[2],[3],[4]. 其中,[0],[1],[2],[3]和[4]分别代表这五个元素的变量名.
为什么下标从0开始而不是1?想象一下,如果从1开始,数组的第五个元素是[5],并且当数组定义为int a [5]时,两者都是[5],这很容易引起混淆. 下标从0开始时不存在此问题!因此,定义一个数组a [n],则该数组中元素的最大索引为n–1;元素a [i]表示数组a中的第i + 1个元素.
此外,方括号中的常量表达式可以是“数字常量表达式”或“符号常量表达式”. 但是无论表达式是什么,它都必须是常量,并且绝对不是变量. 通常,C语言不允许动态定义数组的长度. 换句话说,在程序运行期间,数组的大小不取决于变量的值. 异常情况是动态内存分配. 在这种情况下,可以动态定义数组的长度,这将在后面描述.
一维数组初始化可以使用以下方法实现一维数组初始化:
1)定义数组时,为所有元素分配初始值. 这称为“完全初始化”. 例如:
int a[5] = {1, 2, 3, 4, 5};
通过将数组元素的初始值放在一对大括号中,这样的初始化之后,[0] = 1; a [1] = 2; a [2] = 3; a [3] = 4; [4] = 5,它从左到右依次分配给每个元素. 应该注意的是,在初始化期间,元素之间用逗号而不是分号分隔.
2)您只能为几个元素分配值,这称为“不完全初始化”. 例如:
int a[5] = {1, 2};
已定义的数组a有5个元素,但在花括号中仅提供了两个初始值,这意味着仅初始化了前两个元素a [0]和a [1],而后三个元素是没有初始化. 如果未完全初始化,则未初始化的元素会自动设置为0.

应注意,“未完成初始化”与“未完成初始化”不同. 如果“根本没有初始化”,即仅“ int a [5];”. 未初始化,则每个元素的值都不为0,并且所有元素均为垃圾值.
您也不能写“ int a [5] = {};”. 如果大括号中没有写任何内容,则这是一个非常严重的语法错误. 用大括号写至少一个数字. 例如,“ int a [5] = {0};”一维数组的初始化方法,这一次是为了使数组“零”,这时数组中的每个元素都是零. 此外,如果定义的数组的长度小于大括号中提供的初始值的数量,则它也是语法错误,例如“ a [2] = {1、2、3、4、5 };“.
3)如果在定义数组时为数组中的所有元素分配了初始值,则可能未指定数组的长度,因为已经确定了元素的数量. 我们在编程时经常使用这种书写方式,因为它很方便,不会有问题,也不需要自己计算几个元素. 系统将自动分配空间. 例如:
int a[5] = {1, 2, 3, 4, 5};
可以写为:
int a[] = {1, 2, 3, 4, 5};
在第二种书写方式中,大括号中有5个数字,因此系统将自动将数组a的长度定义为5. 但是,应注意的是,只有在定义数组时进行初始化时才能这样做. 如果在定义数组时未初始化,则省略数组长度是语法错误. 例如:
int a[];
然后它将在编译时提示错误,并且编译器将提示您未指定数组的长度.
这是每个人的简单程序:
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int i;
for (i=0; i<5; ++i)
{
printf("%d\n", a[i]);
}
return 0;
}

输出为:
1
2
3
4
5
a表示数组的名称,[5]表示数组具有5个元素,并由[0],[1],[2],[3]和[4]表示]. 并在大括号中将1、2、3、4、5分配给变量a [0],a [1],a [2],a [3],a [4]. 同样,下标从0开始,即从[0]而不是[1]开始.
您还可以使用scanf从键盘手动初始化阵列:
# include <stdio.h>
int main(void)
{
int a[5] = {0}; //数组清零初始化
int i;
printf("请输入5个数:");
for (i=0; i<5; ++i)
{
scanf("%d", &a[i] );
}
for (i=0; i<5; ++i)
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
输出为:
请输入5个数字: 1 2 3 4 5

1 2 3 4 5
与使用scanf向字符数组输入字符串不同. 您必须使用for循环来输入数字. 不用在输入字符串时使用循环,只需使用scanf.
一维数组元素的参考数组必须在使用前定义. C语言规定只能一一引用数组元素,而不能一次引用整个数组. 如前所述,数组元素的表示形式为:
数组名[下标]
下标可以是整数常量或整数表达式,例如:
a[0] = a[5] + a[7] - a[2 * 3]
请注意,定义数组时使用的“数组名称[常量表达式]”与引用数组元素时使用的“数组名称[下标]”有所不同. 定义数组时的常量表达式公式表示数组的长度,引用数组元素时的下标表示元素的编号. 例如:
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5}; //定义长度为5的数组a
int t;
t = a[3]; /*引用数组a中下标为3的元素a[3], 此时的3不代表数组的长度*/
printf("t = %d\n", t);
return 0;
}
输出为:
t = 4
“ int a [5];”是定义了5个元素的数组一维数组的初始化方法,这5个元素是[0],[1],[2],[3],[4]. t = a [3]中的a [3]不是数组,而是元素a [3].
因此,以下过程是错误的:
# include <stdio.h>
int main(void)
{
int a[5];
a[5] = {1, 2, 3, 4, 5};
return 0;
}
错误的原因是,后面的[5]不是数组. 仅在定义时,“ [常数]”表示数组,方括号中的数字表示数组的长度. 除此之外,在程序中的任何位置都可以看到“ [constant]”不是数组,而只是数组的元素和变量. 这时,“ constant”表示元素的下标.
此外,当单独为元素分配值时,您不能添加括号,因为元素是变量,即[5]只是变量名. 如何在最前面为变量分配值就是现在如何为数组元素分配值,例如“ a [5] = 1;”. 但是对于上述程序,这仍然是错误的. 因为数组元素的下标从0开始,所以数组a的元素只是[0]〜a [4],而没有[5]元素.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-182590-1.html
联想赶紧高价收购
忘不了昨日的美丽
#宋茜4walls##宋茜#