Lecture6一C数组 绳伟光 微纳电子学系 上海交通大学 2017-03-14 1/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lecture 6 — C 数组 绳伟光 微纳电子学系 上海交通大学 2017-03-14 1 / 41
提纲 维数组 多维数组 常量数组 扑克选牌示例 5 *变长数组 2/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 提纲 1 一维数组 2 多维数组 3 常量数组 4 扑克选牌示例 5 ∗变长数组 2 / 41
提纲 一维数组 多维数组 常量数组 扑克选牌示例 变长数组 ¥口卡9,¥于,年20QC 3/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 提纲 1 一维数组 2 多维数组 3 常量数组 4 扑克选牌示例 5 ∗变长数组 3 / 41
标量(Scalar Variables)vs聚集量(Aggregate Variables) 。标量:只持有一个数据项 ·C支持聚集量,聚集量中存储了多个值 ·C中的两类聚集量:数组(arrays)和结构(structures) 。在C,一维数组(one-dimensional arrays)比多维数组 (multidimensional arrays)更重要 4/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 标量 (Scalar Variables) vs 聚集量 (Aggregate Variables) 标量:只持有一个数据项 C 支持聚集量,聚集量中存储了多个值 C 中的两类聚集量:数组 (arrays) 和结构 (structures) 在 C,一维数组 (one-dimensional arrays) 比多维数组 (multidimensional arrays) 更重要 4 / 41
一维数组 ·数组是一种存储了相同类型数据值序列的数据结构 。数组中存储的值称为元素(elements),这些元素可以通过 它们在数组中的位置进行单独的访问 ·最简单的数组是一维数组 ·一维数组的元素可以从概念上认为一个挨一个的存储在一行 或者一列中: a 5/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 一维数组 数组是一种存储了相同类型数据值序列的数据结构 数组中存储的值称为元素 (elements),这些元素可以通过 它们在数组中的位置进行单独的访问 最简单的数组是一维数组 一维数组的元素可以从概念上认为一个挨一个的存储在一行 或者一列中: 5 / 41
数组声明 。声明数组既要指定元素的类型,还要指定元素的个数: int a[10]; ·数组元素可以是任何类型,数组长度(元素个数)可以是任何 整型常量表达式 ·经常用宏来定义数组元素的个数 #define N 10 int a[N]; 6/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组声明 声明数组既要指定元素的类型,还要指定元素的个数: int a[10]; 数组元素可以是任何类型,数组长度 (元素个数) 可以是任何 整型常量表达式 经常用宏来定义数组元素的个数 #define N 10 ... int a[N]; 6 / 41
数组下标(Subscripting) ·为了访问某个数组元素,用数组名后跟中括号,中括号内是 表示元素在数组中位置的整数或整型常量表达式 ●上述操作被称为数组下标(subscripting)或索引(index- ing)操作 ●对于内含N个元素的数组,其下标的范围为0到N-1 。对于包含10个元素的数组a,其元素依次为:a[0],a[1], a[9] a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9] 7/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组下标 (Subscripting) 为了访问某个数组元素,用数组名后跟中括号,中括号内是 表示元素在数组中位置的整数或整型常量表达式 上述操作被称为数组下标 (subscripting) 或索引 (indexing) 操作 对于内含 N 个元素的数组,其下标的范围为 0 到 N-1 对于包含 10 个元素的数组 a,其元素依次为:a[0], a[1], . . ., a[9] 7 / 41
数组下标操作 。表达式a[i]是左值(Ivalues),可以像正常的变量一样使 用 a[0]=1; printf("%dIn",a[5]); +a[i]; 。通常,如果一个数组的基本类型为T,其任何一个元素都可 以当作一个T类型的变量使用 8/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组下标操作 表达式 a[i] 是左值 (lvalues),可以像正常的变量一样使 用 a[0] = 1; printf("%d\n", a[5]); ++a[i]; 通常,如果一个数组的基本类型为 T,其任何一个元素都可 以当作一个 T 类型的变量使用 8 / 41
数组下标操作(续) ·很多程序包含依次处理数组中元素的循环 。操作N元素数组的示例: for (i=0;i<N;i++) a[i]=0;/clears a * for (i=0;i<N;i++) scanf("%d",&a[i]);/*reads data into a * for (i=0;i<N;i++) sum +a[i];/sums the elements of a * 9/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组下标操作 (续) 很多程序包含依次处理数组中元素的循环 操作 N 元素数组的示例: for (i = 0; i < N; i++) a[i] = 0; /∗ clears a ∗/ for (i = 0; i < N; i++) scanf("%d", &a[i]); /∗ reads data into a ∗/ for (i = 0; i < N; i++) sum += a[i]; /∗ sums the elements of a ∗/ 9 / 41
数组越界 ·C不检查数组访问下标的范围是否合法,因此下标越界会导 致未定义行为 ·C系列语言中程序员常犯的错误是忘记N元素数组的下标范 围是从0到N-1,而不是从1到N int a[10],i; for(i=1;i<=10;1++) a[i]=0; 在有些编译器中,上述代码可能引起无限循环,因为内存分配时 ⅰ可能恰好在数组a后面,也就是a[10]的位置,从而导致i又 变回0! 10/41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 数组越界 C 不检查数组访问下标的范围是否合法,因此下标越界会导 致未定义行为 C 系列语言中程序员常犯的错误是忘记 N 元素数组的下标范 围是从 0 到 N-1,而不是从 1 到 N int a[10], i; for (i = 1; i <= 10; i++) a[i] = 0; 在有些编译器中,上述代码可能引起无限循环,因为内存分配时 i 可能恰好在数组 a 后面,也就是 a[10] 的位置,从而导致 i 又 变回 0! 10 / 41