007-数组A更新比老谭还要通俗易懂的北理工C语言无敌教材
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
.
.
.
.
.
高地址
94.0
mark[99]
14
7.2 数组的定义与引用
二维数组存放:
例如:整型数组 b b[3][3]={ {1,2,3},
{4,5,6}, {7,8,9} };
先存放第 1 行的所有元 素;再存放第 2 行的所 有元素;最后存放第3 行中的所有元素。
地址
3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H
scanf (“%d”, x);
printf (“%d”, x);
printf (“%d%d%d%d%d%d”, x);
(3) 对于存储于数组中的字符串可进行整体访问
char str[10]; scanf (“%s”, str); printf (“%s”, str);
24
7.2 数组的定义与引用
概念:数组名,维数,长度,体积,元素,基类型 mark、str、a 是数组名; 下标的个数称为数组的维数; 方括号内是数组某一维的长度; 数组中所包含的元素数量即体积; 数组的成员称为数组元素; 数组元素的类型称为该数组的基类型。
5
第7章 数组
数组的概念 数组的定义与引用 一维字符数组 字符串处理函数 二维字符数组 编程实例
的数量,自动确定第1维的大小。
19
7.2 数组的定义与引用
六、一维数组的引用
(1) 下标与地址的关系 数组名、数组元素是两种不同性质的数据。 int a[3]; a[0]=1; a[1]=2; a[2]=3; 数组名是数组的首地址,是一个地址常量! 数组元素则是变量。
20
7.2 数组的定义与引用
n维数组:
低地址
int c[a1][a2]...[an]
...... c[0][0]...[0][an-1]
c[0][0]...[1][0] c[0][0]...[1][1]
......
c[0][0]...[1][an-1] ......
高地址
c[0][0]...[an-1-1][an-1] ......
6
7.2 数组的定义与引用
一、数组定义
数据类型 数组名[常量表达式1]…[常量表达式n]
基类型
第1维的大小
维数
例如: float mark[100]; char str[200]; int a[4][6];
7
ቤተ መጻሕፍቲ ባይዱ
7.2 数组的定义与引用
数组名:对数组的标识,遵循C语言标识符规则 数据类型(基类型)——数组元素的数据类型 下标运算符——数组名后面的方括号[ ]是下标运
值 数组元素
1 b[0][0] 2 b[0][1] 3 b[0][2] 4 b[1][0] 5 b[1][1] 6 b[1][2] 7 b[2][0] 8 b[2][1] 9 b[2][2]
15
7.2 数组的定义与引用
一般而言,多维数组的元素按行顺序存放,
存储顺序是:
第一维的下标变化最慢
c[0][0]...[0][0] c[0][0]...[0][1]
这些数据的特点:1. 具有相同的数据类型 2. 使用过程中需要保留原始数据
C语言为这些数据提供了一种构造数据类型:数组
一组具有相同数据类型的数据的 有序集合
4
7.1 数组的概念
例如:存储学生成绩用实型数组 mark[100] 存储一行文字用字符数组 str[200] 存储一个4*6的矩阵用二维整型数组 a[4][6]
*b <=> b[0] *b[0] <=> b[0][0] **b <=> b[0][0] **(b+1) <=> b[1][0] b[1][2]<=> *(b[1]+2) <=> *(*(b+1)+2)
26
7.2 数组的定义与引用 行首地址
(2) 按数组名引用二维数组的元素
printf(“ %d \n”, *(b[i]+j)); 3000H 1
sum += x; }
float m[100],sum=0; 数组方式 for ( i=0; i<100; i++ ) { scanf(“%f\n”, &m[i]);
sum += m[i]; }
x 868532 sum 718945580
m[0] 85 m[1] 63 m[2] 78
90
m[99] 82
二维数组可以用来表示矩阵,a可以表示一 个2×3的矩阵:
321 765
11
优点:数据重用
引用数组元素的注意事项:
数据有序
数组中每个元素在功能上等价于一个一般变量。
例如:输出100个学生成绩,并求出总成绩。
float x, sum=0; 简单变量 for (i=0; i<100; i++) { scanf(“%f\n”, &x);
23
(2) 对于非字符数组按元素访问
输入/输出数组:int x[6];
必须一个
正确:for (k=0; k<6; k++)
一个访问
scanf (“%d”, &x[k]);
for (k=0; k<=5; ++k)
printf (“%d\n”, x[k]);
错误:scanf (“%d%d%d%d%d%d”, x);
25
… ……
数组名称 一维下标 含义 的含义
b
b[0]
b[0]+1
b+1
b[1]
b[1]+2 b[2]
b[3]
int b[4][3];
二维下标 元素在内存中的
的含义
存储顺序
b[0][0]
b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] b[2][0] b[2][1] b[2][2] b[3][0] b[3][1] b[3][2]
printf("%d\n",a+2); 2293608 地址常量
printf("%d\n",&a[0]+2); 2293608 地址常量
}
22
main() { int a[3];
scanf("%d",&a[0]); scanf("%d",a); printf("%d\n",a[0]); printf("%d\n",*a); }
算符,不允许使用括号() 。
常量表达式——数组元素的个数,必须是常量。
8
7.2 数组的定义与引用
二、数组定义中常见的错误
① float a[0]; /* 数组大小为0没有意义 */
② int b(2)(3); /* 不能使用圆括号 */
③ int k, a[k]; /* 不能用变量说明数组大小 */
结果为:a[0][0]=1, a[0][1]=2, a[0][2]=3,
a[1][0]=4, a[1][1]=5, a[1][2]=6
按数组在内存单元的存贮顺序赋初值 int a[2][2][2] = {1, 2, 3, 4, 5, 6, 7, 8};
等价于:int a[2][2][2] = {{1,2},{3,4},{5,6},{7,8}};
printf(“ %d \n”, b[i][j]); 3002H 2 3004H 3
&b[1][2]=b[1]+2
3006H 4
地址的计算:
④ int k=3, a[k]; ⑤ int n;
scanf (“%d”, &n);
#define N 5
int a[N][N];√
int a[n];
C语言不允许对数组的大小进行动态说明。
数组的定义语句必须在可执行语句之前。
9
7.2 数组的定义与引用
三、数组元素的引用
通过下标引用数组元素,格式: 数组名 [下标表达式1]…[下标表达式n]
m[245673i ]
各元素变 量名相同
用下标控制各 元素的访问
m[99]
2
第7章 数组
数组的概念 数组的定义与引用 一维字符数组 字符串处理函数 二维字符数组 编程实例
3
7.1 数组的概念
问题:
如何处理一个班学生的学习成绩? 一行文字怎样存储? 一个矩阵怎样存储 ?......
}
13
7.2 数组的定义与引用
四、数组在内存中的存放
一维数组存放 float mark[100];
低地址
每的个 字数数 节组据 数m元 ,a素 就rk占是占用基 类型40的0字个节字数节
一个元素占4个字节
86.5 mark[0]
92.0 mark[1]
77.5 mark[2]
52.0 mark[3]
c[a1-1][a2-1]...[an-1-1][an-1]
16
7.2 数组的定义与引用
五、数组的初始化
一维数组初始化
静态存储数组和 外部存储数组的
一般方法:
初值自动设置为
int a[6]={1,2,3,4,5,6}; 0(变量也是如此)
初始化部分元素
int b[10]={1,2,3};
间接引用
21
main() { int a[3]={1,2,3};
对a解地址运算
printf("%d\n",a[0]); 1
printf("%d\n",*a);
1
printf("%d\n",a);
2293600 地址常量
printf("%d\n",&a[0]); 2293600 地址常量
printf("%d\n",a[2]); 3 printf("%d\n",*(a+2)); 3
下标
下标表达式的值必须是整型数据 定义数组:int a[10];
说明数组a一共有10个元素 数组a的10个元素分别是:a[0]、a[1]、…、
a[9]
10
7.2 数组的定义与引用
定义数组:int a[2][3]; 说明数组a一共有6个元素
数组a的6个元素分别是:a[0][0]、a[0][1] 、a[0][2]、a[1][0]、a[1][1]、a[1][2]。
七、二维数组的引用
(1) 二维数组的地址
二维数组名 b 表示二维数组的首地址 b[i] 表示i行一维数组的首地址且有:
b[i]+j &b[i][j] b+i表示i行首地址——b[i]的地址
二维数组是 b b[0] 2 5 9 数组的数组 b+1 b[1] 3 2 5 b+2 b[2] 4 7 1
数组
问题: 输入100个数,输出平均值和所 有大于平均值的数
首先,原始数据要保存
int a,b,c,…;
循环? 需要可控的变量
只好:
scanf(“%d”,&a); scanf(“%d”,&b); scanf(“%d”,&c); ……
1
第7章 数组
重要思想方法:
连续存放、类型相同、变量可控
内存
m[0] m[1] m[2]
float mark[100]
2000H 86.5 mark[0]
2004H 92.0 mark[1]
2008H 77.5 mark[2]
200CH 52.0 mark[3]
.
.
.
地2.. 0址00的+2计*4算..=2:008
. .
218CH 94.0 mark[99]
引用数组元素的另 一种方式:给出该 元素的地址,取出 该地址的内容,即: mark[2]等价于 *(mark+2)
sum 7231892145680 12
7.2 数组的定义与引用
按下标引用二维数组元素举例:
main( ) { int a[2][3],i,j;
for(i=0;i<2;i++) for(j=0;j<3;j++) scanf(“ %d \n”, &a[i][j]);
for(i=0;i<2;i++) for(j=0;j<3;j++) printf(“ %d \n”, a[i][j]);
static int b[10]={1,2,3};
根据数据定义数组长度
double c[ ]={1.0,2.1,3.2,4.5};
数组的越界引用编译器不报错; 但初始化越界将报错!
17
7.2 数组的定义与引用
二维数组初始化
按行排列赋初值
123 456
int a[2][3] = { {1,2,3}, {4,5,6} };
int a[2][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}}};
18
7.2 数组的定义与引用
初始化部分元素 static int a[2][3] = { {1}, {4} };
结果为: a[0][0]=1, a[1][0]=4, 其余元素均为0。 static int a[3][3] = { {1,2}, { }, {4,5,6} };
结果为:a[0][0]=1, a[0][1]=2, a[2][0]=4, a[2][1]=5, a[2][2]=6, 其余元素均为0。
对多维数组全部元素进行初始化时,可省略 数组说明中第1维的大小。
static int a[ ][3] = {1, 2, 3, 4, 5, 6}; 注意:此时只能省略第 1 维的值。C根据初始化数据