c语⾔常量数组只初始化部分,数组的定义,初始化和使⽤,C
语⾔数组详解
数组可以说是⽬前为⽌讲到的第⼀个真正意义上存储数据的结构。虽然前⾯学习的变量也能存储数据,但变量所能存储的数据很有限。不仅如此,数组和指针(后续会讲)是相辅相成的,学习数组可以为学习指针打下基础。
那么到底什么是数组呢?顾名思义数组就是很多数的组合!那么这些数有没有什么要求呢,是不是不管什么数组合在⼀起都是数组呢?同⼀数组中存储的数必须满⾜以下两个条件:
这些数的类型必须相同。
这些数在内存中必须是连续存储的。
换句话说,数组是在内存中连续存储的具有相同类型的⼀组数据的集合。
⼀维数组
⼀维数组的定义⽅式如下:
类型说明符 数组名[常量表达式];
例如:
int a[5];
它表⽰定义了⼀个整型数组,数组名为 a,定义的数组称为数组 a。数组名 a 除了表⽰该数组之外,还表⽰该数组的⾸地址(关于地址现在先不讨论,稍后讲指针的时候再说)。
此时数组 a 中有 5 个元素,每个元素都是 int 型变量,⽽且它们在内存中的地址是连续分配的。也就是说,int 型变量占 4 字节的内存空间,那么 5 个int型变量就占 20 字节的内存空间,⽽且它们的地址是连续分配的。
这⾥的元素就是变量的意思,数组中习惯上称为元素。
在定义数组时,需要指定数组中元素的个数。⽅括号中的常量表达式就是⽤来指定元素的个数。数组中元素的个数⼜称数组的长度。
数组中既然有多个元素,那么如何区分这些元素呢?⽅法是通过给每个元素进⾏编号。数组元素的编号⼜叫下标。
数组中的下标是从 0 开始的(⽽不是 1)。那么,如何通过下标表⽰每个数组元素的呢?通过“数组名[下标]”的⽅式。例如“int a[5];”表⽰定义了有 5 个元素的数组 a,这 5 个元素分别为 a[0]、a[1]、a[2]、a[3]、a[4]。其中 a[0]、a[1]、a[2]、a[3]、a[4] 分别表⽰这 5个元素的变量名。
为什么下标是从 0 开始⽽不是从 1 开始呢?试想,如果从 1 开始,那么数组的第 5 个元素就是 a[5],⽽定义数组时是 int a[5],两个都是 a[5] 就容易产⽣混淆。⽽下标从 0 开始就不存在这个问题了!所以定义⼀个数组 a[n],那么这个数组中元素最⼤的下标是 n–1;⽽元素 a[i] 表⽰数组 a 中第 i+1 个元素。
另外,⽅括号中的常量表达式可以是“数字常量表达式”,也可以是“符号常量表达式”。但不管是什么表达式,必须是常量,绝对不能是变量。通常情况下 C 语⾔不允许对数组的长度进⾏动态定义,换句话说,数组的⼤⼩不依赖程序运⾏过程中变量的值。⾮通常的情况为动态内存分配,此种情况下数组的长度就可以动态定义,这个稍后会讲。
⼀维数组初始化
c语言和c++区别
⼀维数组的初始化可以使⽤以下⽅法实现:
1) 定义数组时给所有元素赋初值,这叫“完全初始化”。例如:
int a[5] = {1, 2, 3, 4, 5};
通过将数组元素的初值依次放在⼀对花括号中,如此初始化之后,a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[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 int main(void) { int a[5] = {1, 2, 3, 4, 5}; int i; for (i=0; i<5; ++i) { printf("%dn", a[i]); } return 0; }
输出结果是:
1
2
3
4
5
a 表⽰数组的名字,[5] 表⽰这个数组有 5 个元素,并分别⽤ a[0]、a[1]、a[2]、a[3]、a[4] 表⽰。并分别把花括号内的 1、2、3、4、
5 赋给变量 a[0]、a[1]、a[2]、a[3]、a[4]。再次强调,下标从 0 开始,即从 a[0] 开始,⽽不是 a[1]。
也可以⽤ scanf ⼿动从键盘对数组进⾏初始化:
# include 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("%dx20", 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 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 = %dn", t); return 0; }
输出结果是:
t = 4
“int a[5];”是定义了有 5 个元素的数组,这 5 个元素分别为 a[0]、a[1]、a[2]、a[3]、a[4]。⽽ t=a[3] 中的 a[3] 不是数组,只是其中的元素 a[3]。
因此,下⾯这个程序是错的:
# include int main(void) { int a[5]; a[5] = {1, 2, 3, 4, 5}; return 0; }
错误的原因是下⾯的 a[5] 不是数组。只有在定义的时候“a[常量]”表⽰的才是数组,此时⽅括号中的数字才表⽰数组长度。除此之外程序中任何地⽅看到“a[常量]”都不是数组,都只是数组的⼀个元素、⼀个变量,此时的“常量”表⽰的是元素的下标。
此外,当给元素单独赋值时不能加⼤括号,因为元素就是变量,即 a[5] 只是⼀个变量名。前⾯是怎么给变量赋值的现在就怎么给数组元素赋值,⽐如“a[5]=1;”。但是对于上⾯这个程序,这么写还是错误的。因为数组元素的下标是从 0 开始的,数组 a 的元素只有
a[0]~a[4],并没有 a[5] 这个元素。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。