......
第11章 指针和数组 11章
......
本章学习内容指针与一维数组间的关系,指针与二维 指针与一维数组间的关系, 数组间的关系 向函数传递一维数组和二维数组 指针数组, 指针数组,命令行参数 动态数组, 动态数组,动态内存分配
2012-4-2
2/42
......
11.1 指针和一维数组间的关系int a0x0037b000
a[4]={1,2,3,4};….
int *pa=a; int *pa=&a[0];
pa0x0037b004 0x0037b008 0x0037b00B
1 2 3 4…...
a[0] a[1] a[2] a[3] 指针可当数组名使用 数组名是一个常量指针 不能修改该指针的指向
2012-4-2
3/42
......
11.1 指针和一维数组间的关系int a0x0037b000
a[4]={1,2,3,4};….
int *pa=a; int *pa=&a[0];
pa0x0037b004
1 pa[0] 2 *(a+1)
a[0] a[1] a[2] a[3] 数组元素的等价引用形式 a[i] *(a+i) pa[i] *(pa+i)
a+10x0037b008
3 pa+2 *(pa+2) 0x0037b00B 4 *pa…...
2012-4-2
4/42
......
11.1 指针和一维数组间的关系int a0x0037b000
a[4]={1,2,3,4};….
for (i=0; i<4; i++) scanf("%d", &a[i]); for (i=0; i<4; i++) printf("%d ", a[i]);
p0x0037b004 0x0037b008 0x0037b00B
1 *p 2 *p 3 4…...
a[0] a[1] a[2] a[3]
for (p=a; p<(a+4); p++) scanf("%d", p); for (p=a; p<(a+4); p++) printf("%d ", *p);5/42
a+42012-4-2
......
11.1 指针和一维数组间的关系【例11.1】演示数组元素的引用方法 11.1】
2012-4-2
6/42
......
11.1 指针和一维数组间的关系【例11.1】演示数组元素的引用方法 11.1】
2012-4-2
7/42
......
11.1 指针和一维数组间的关系【例11.2】演示数组和指针变量作函数参数 11.2】被调函数的形参声明为 数组类型, 数组类型,用下标法访 问数组元素
2012-4-2
8/42
......
11.1 指针和一维数组间的关系【例11.2】演示数组和指针变量作函数参数 11.2】被调函数的形参声明为 指针类型 类型, 指针类型,用指针法访 问数组元素
2012-4-2
9/42
......
11.1 指针和一维数组间的关系【例11.2】演示数组和指针变量作函数参数 11.2】在主函数中这样做没有 多大的实际意义
2012-4-2
10/42
......
11.2 指针和二维数组间的关系可将二维数组看作一维数组,其每个数组元素又是 可将二维数组看作一维数组, 一个一维数组a a[0][0] 按行顺序存放所有元素 &a[0][0] a[0] short a[2][3];a[0] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]a[0][0] a[0][1]
&a[0][1] a[0]+1 &a[0][2] a[0]+2 a+1 &a[1][0] a[1] a[1][0] &a[1][1] a[1]+1 &a[1][2] a[1]+2a[0][2] a[1][0] a[1][1] a[1][2]11/42
aa[1]
2012-4-2
......
11.2 指针和二维数组间的关系a 代表二维数组的首地址,第0行的地址,行地址 代表二维数组的首地址, 的地址, a + i 代表第i行的地址 代表第 但并非增加i个字节! 但并非增加i个字节!short a[2][3];a[0] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
aa[0][0] a[0][1] a[0][2]
a+1a[1][0] a[1][1] a[1][2]12/42
aa[1]
2012-4-2
......
11.2 指针和二维数组间的关系*(a + i) 即 a[i] 代表第i行
第0列的地址,列地址 代表第 行 的地址,a *(a+i) + j 即 a[i] + j代表 &a[0][0] a[0] 代表 a[0][0]
的地址&a[i][j] 第i行第j列的地址 行short a[2][3];a[0] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
a[0][0] a[0][1]
a+1 &a[1][0] a[1] a[1][0]
a[0][2] a[1][0] a[1][1]
aa[1]
&a[1][2] a[1]+2
a[1][2]13/42
2012-4-2
......
11.2 指针和二维数组间的关系*(a + i) 即 a[i] 代表第i行第0列的地址,列地址 代表第 行 的地址,a *(a+i) + j 即 a[i] + j代表 &a[0][0] a[0] 代表 a[0][0]
的地址&a[i][j] 第i行第j列的地址 行 *( *(a+i) + j ) 即 a[i][j] a[0][0] 代表第 行第 行第j列 代表第i行第 列的内容 a[0] a[0][1] aa[1] a[0][2] a[1][0] a[1][1] a[1][2]
a[0][0] a[0][1]
short a[2][3];
a+1 &a[1][0] a[1] a[1][0]
a[0][2] a[1][0] a[1][1]
&a[1][2] a[1]+2
a[1][2]14/42
2012-4-2
......
11.2 指针和二维数组间的关系二维数组的行 二维数组的行指针int (*p)[3]; p = a; //用行地址初始化 //用行地址初始化 short a[2][3];
p
aa[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
逐行查找逐行查找-〉逐列查找a+1
2012-4-2
15/42
......
11.2 指针和二维数组间的关系二维数组的行 二维数组的行指针int (*p)[3]; p = a; //用行地址初始化 //用行地址初始化 short a[2][3]; aa[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]2012-4-2 16/42
逐行查找逐行查找-〉逐列查找a+1
p
......
11.2 指针和二维数组间的关系二维数组的行 二维数组的行指针int (*p)[3]; p = a; //用行地址初始化 //用行地址初始化 short a[2][3]; aa[0][0] a[0][1] a[0][2] a[1][0] a[1][1]
逐行查找逐行查找-〉逐列查找for (i=0; i<m; i++) for (j=0; j<n; j++) printf("%d",*(*(p+i)+j)); *(*(p+i)+j)); a+1
p2012-4-2
a[1][2]17/42
......
11.2 指针和二维数组间的关系二维数组的列 二维数组的列指针int *p; p = *a; //用列地址初始化 //用列地址初始化 short a[2][3]; *a或 p *a或 a[0]a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]2012-4-2 18/42
逐个查找—— 逐个查找——相对偏移量 ——相对偏移量for (i=0; i<m; i++) for (j=0; j<n; j++) printf("%d",*(p+i*n+j)); *(p+i*n+j) p[i*n+j i*n+j]
......
11.2 指针和二维数组间的关系【例11.3】输入一个3行4列的 11.3】输入一个3 二维数组, 二维数组,然后输出这个 二维数组的元素值
2012-4-2
19/42
......
11.2 指针和二维数组间的关系【例11.3】输入一个3行4列的二维数组,然后输出 11.3】输入一个3 列的二维数组, 这个二维数组的元素值形参声明为列数已知的 二维数组
2012-4-2
20/42
......
11.2 指针和二维数组间的关系【例11.3】输入一个3行4列的二维数组,然后输出 11.3】输入一个3 列的二维数组, 这个二维数组的元素值形参声明为指向列数已知 的二维数组的行指针
2012-4-2
21/42