《2022年C语言数组基础知识讲解 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言数组基础知识讲解 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数组基础知识讲解1. 数组简介数组( Array)由一系列同种数据类型的元素组成。编译器可以从数组声明中知道数组中元素的数目,以及这些元素的数据类型。例如:double dbl20; /* 包含20 个 double 类型元素的数组*/ int c12; /* 包含12 个 int 型元素的数组*/ char ch40; /* 包含40 个 char 型元素的数组*/ 方括号 表明它们是数组, 里的数字表明数组包含的元素数目。数组中的元素是相邻的,初始化之前, 元素的值可能是随机的。下图形象地表现了这种相邻关系。使用数组名和下标(subscript number 或 index)就可以访问特定
2、的元素。下标始于0,止于 n - 1。例如:c0 是数组c 的第一个元素, 而 c11 是它的最后一个元素,也就是第12 个元素。2. 初始化int c12 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ; 如上所示, 我们使用大括号中一系列逗号分隔的值来初始化数组。我们把这个称之为初始化列表。 大括号是必须的! 逗号和值之间的空格可有可无。初始化后,数组c 的第一个元素c0 的值为0,以此类推。下面的小程序输出数组iarr 中所有元素的值。#include int main(void) int iarr4 = 0, 1, 2, 3 ; int i = 2; p
3、rintf(%d , iarr0); /* 输出0 */ printf(%d , iarr1); /* 输出1 */ printf(%d , iarri); /* 输出2 */ printf(%d , iarr1+2); /* 输出3 */ return 0; 如上所示,访问数组元素时, 里的可以是常量,可以是变量,也可以是表达式。 里还可以是返回值为整型的函数调用。总之,只要 里的值是整数类型都可以。注意,上面的程序,如果把int iarr4 = 0, 1, 2, 3 ; 改成int iarr4; (即没有初始化) ,则它里面的元素的值是随机的,也就是本来就存在于那段内存空间的值。如果改成i
4、nt iarr4; 后再把它放在int main(void) 之前,则它里面的元素的值都是0。具体原因我在后续的教程会说明。如果初始化列表中的值的个数少于数组元素个数,则余下的元素都会被初始化为0。例如:int iarr4 = 0, 1 ; iarr0 和 iarr1 分别为0 和 1; iarr2 和 iarr3 都被初始化为0。注意,初始化列表中的值的个数可以少于数组元素个数,但是超过数组元素个数却是不对的!名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页
5、,共 4 页 - - - - - - - - - 初始化数组时, 里可以留空。例如:int iarr = 1, 2, 3 ; 编译器会算出初始化列表中的值的个数,然后构造包含那么多个元素的数组。如上例, 编译器会算出列表中一共有3 个值,然后把iarr 构造成包含3 个元素的数组。例如:#include int main(void) int iarr = 1, 2, 3 ; printf(%d , iarr0); /* 输出1 */ printf(%d , iarr1); /* 输出2 */ printf(%d , iarr2); /* 输出3 */ return 0; 我们可以用以下表达式算
6、出iarr 中元素的个数:sizeof iarr / sizeof iarr0 其中, sizeof iarr 算出数组iarr 占用的内存大小,sizeof iarr0 算出iarr0 占用的内存大小(也就是数组iarr 中每个元素占用的内存大小),它们相除就得出iarr 的元素个数。 sizeof 是一个运算符,具体用法我以后会说。3. 指派初始值( Designated Initializers )指派初始值这个特性是C99 增加的, 它允许我们直接初始化数组中特定的元素。C99 以前,如果我们要初始化数组中的某个元素,如第三个元素, 必须同时初始化它之前的元素。例如:int iarr1
7、0 = 0, 0, 300 ; 而 C99 中,我们可以这样初始化特定的元素:int iarr10 = 2 = 300 ; /* 指派初始化iarr2 为 300 */ 其余的元素都会被初始化为0 。下面我们来看一个小程序。#include int main(void) int iarr5 = 6, 3, 3 = 1, 5, 1 = 8; printf(%d , iarr0); printf(%d , iarr1); printf(%d , iarr2); printf(%d , iarr3); printf(%d , iarr4); return 0; 输出为:6 8 0 1 5 名师归纳总
8、结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 4 页 - - - - - - - - - 从中可以看出两点:A. 如果指派初始值后面还有值,则后面的值会被用于初始化后续的元素。上例中,iarr3 被初始化为1 ,它后续的元素iarr4 被初始化为5。B. 如果初始化列表中多次出现对某元素的初始化,则以最后一次为准。上例中,iarr1 先被初始化为3,然后被1 = 8 指派初始化为8。4. 给数组元素赋值我们可以利用下标给特定的元素赋值。例如:int iarr5;
9、 iarr0 = 100; /* 赋值给第一个元素*/ iarr4 = 120; /* 赋值给第五个元素*/ iarr2 = 180; /* 赋值给第三个元素*/ C 不允许直接使用数组对别的数组进行赋值,也不允许使用初始化列表对数组进行赋值。例如:int iarr_15 = 1, 2, 3, 4, 5 ; /* 正确*/ int iarr_25; iarr_2 = iarr_1; /* 错误!*/ iarr_25 = 3, 4, 5, 6, 7 ; /* 错误!*/ iarr_25 = iarr_15; /* 越界!*/ 最后一个语句发生了越界!因为这两个数组都只有5 个元素, 而使用下标5
10、 访问的是第六个元素!5. 数组界限( array bounds )使用下标时,我们必须确保下标没有越界。例如:int iarr46; 这个数组的下标范围是0 到 45,确保下标没有超出这个范围是我们的责任,因为编译器不会对下标越界进行检测!C 标准没有定义下标越界的后果,也就是说, 当我们写的程序中出现下标越界的问题,程序可能正常工作,也可能异常退出,还有可能出现其它奇怪的情况。#include int main(void) int var_1 = 20; int arr5; int var_2 = 40; printf(var_1: %d, var_2: %d , var_1, var_2
11、); arr-1 = -1; arr5 = 5; printf(%d %d , arr-1, arr5); printf(var_1: %d, var_2: %d , var_1, var_2); return 0; 上述程序使用Dev-C+ 4.9.9.2 编译运行的输出为:名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 4 页 - - - - - - - - - var_1: 20, var_2: 40 -1 5 var_1: 20, var_2:
12、-1 可见,下标越界可能改变其它变量的值。这是因为gcc (dev-c+ 使用的C 编译器)把 var_2 保存于数组arr 之前的内存空间, 所以对arr-1 赋值正好改变了var_2 的值。不同的编译器编译运行该程序可能会有不同的输出,也可能会异常退出。C 语言的哲学是信任程序员,而且不检测越界程序运行更快。程序编译时有些下标的值仍然是不可知的, 所以如果要检测下标越界的话,编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序运行速度下降。故而,为了运行效率,C 不检测下标是否越界。6. 指定数组元素数目C99 之前,声明数组时, 中的值必须是大于零的整
13、数常量。C99 中,声明数组时, 中可以是变量。这就是所谓的变长数组(variable-length array ,简称VLA) 。声明VLA 时,不能对其进行初始化。在后续的教程中,我会对VLA 进行详细讲解。int n = 99; double dbl_14; /* 正确*/ double dbl_28/2 + 4; /* 正确 */ int iar_1-5; /* 错! 中的值必须大于0 */ int iar_20; /* 错! 中的值必须大于0 */ int iar_39.2; /* 错! 中的值必须是整数类型*/ char chn; /* C99 之前不支持!*/ 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 4 页 - - - - - - - - -