第12讲 C语言二维数组与指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p=*a; p=&a[0][0]; p=*a[0]; p=a;
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
•通过指针数组来引用二维数组元素
若有以下定义:
int *p[3],a[3][4],i,j;
表示p是一个数组名,该数组类型为指针类 型,即数组的3个元素均为指针类型的数据。 注意: int *p[4]与int (*p)[4]代表不同的含 义。
a[0][2]
a[0][3] 2010 a[1][0] a[1][1] a[1][2] 2020 a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[1] a[1]+1 *(a+1)+1
2014
a+2 2020
a[2] a[2]+1 *(a+2)+1
2024
• 二维数组的地址
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•按元素排列顺序部分初始化
部分初始化
例 int a[2][3]={1,2,4};
1 2 4 0 0 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
定义 int i;
含义 定义整型变量i
p为指向整型数据的指针变量 定义含n个元素的整型数组a n个指向整型数据的指针变量组成的指针数组p p为指向含n个元素的一维整型数组的指针变量 f为返回整型数的函数 p为返回指针的函数,该指针指向一个整型数据 p为指向函数的指针变量,该函数返回整型数 p为指针变量,它指向一个指向整型数据的指针变量
• •
a+i &a[i],表示第i行首地址,指向行 a[i] *(a+i) &a[i][0],表示第i行第0列元 素地址,指向列
• 二维数组的地址
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
int a[3][4];
首元素地址表示: (1) a+1 行指针 (2) &a[1][0] 列指针 (3) a[1] (4) *(a+1) 元素地址表示: (1) &a[1][2] (2) a[1]+2 (3) *(a+1)+2 (4)&a[0][0]+1*4+2 二维数组元素表示形式: (1)a[1][2] (2)*(a[1]+2) (3)*(*(a+1)+2) (4)*(&a[0][0]+1*4+2)
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) { if((p-a[0])%4==0) printf("\n"); printf("%4d ",*p); } }
• 二维数组的地址
int a[3][4];
a
2000 a[0] a[0]+1 *(a+0)+1
*(a[0]+1) *(*(a+0)+1) 2000 2004
a[0][0] a[0][1]
对于二维数组: (1)a是数组名。 包含三个元素 : a[0],a[1],a[2] a+1 2010 (2)每个元素a[i]又是 一个一维数组,包含4 个元素: a[i][0]、 a[i][1]、 a[i][2]、 a[i][3]
•通过指向一维数组的指针变量来引用数组元素
定义形式:
如: int (*p)[4]; p的值是一维数组的 首地址,p是行指针 可让p指向二维数组的某一行 如:int a[3][4], (*p)[4]=a; 一维数组指针变量维数和 二维数组列数必须相同 ( )不能少 int (*p)[4]与int *p[4]不同
全国计算机等级考试
二级C语言
好好考
(www.haohaokao.com)
第12讲 二维数组与指针
二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 真题分析
第一节 二维数组的定义
• 定义形式:
数据类型 数组名[常量表达式1][常量表达式2]
若 int a[3][4], (*p1)[4]=a;
int *p2=a[0]; 实参 数组名a 数组名a 指针变量p1 指针变量p1 指针变量p2 形参 数组名int x[][4] 指针变量int (*q)[4] 数组名int x[][4] 指针变量int (*q)[4] 指针变量int *q
•指针的数据类型小结
a[1][0] • a[i]+j *(a+i)+j -----第i行第j列元素的地址 a[1][1] • *(a[i]+j) *(*(a+i)+j) a[i][j]
a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a+2
2020
a[2]
2020 2024
数据类型 (*指针名)[数组大小]
•通过指向一维数组的指针变量来引用数组元素
a
a[0][0] a[0][1] a[0][2] a[0][3]
p p[0]+1或 *p+1 *(*p+1)或 (*p)[1]
p+1 p[1]+2或 *(p+1)+2 *(*(p+1)+2) p+2
int a[3][4], (*p)[4]=a; a+1
int a[3][4]; a[0][0] a[0][1] a[0][2]
p[0] p[1] p[2]
a[0][3] a[1][0] a[1][1] a[1][2]
a[1][3]
a[2][0] a[2][1]
p[0]=*a; p[0]=&a[0][0]; p[0]=a[0];
a[2][2]
a[2][3]
第二节 二维数组的初始化及引用
•按元素排列顺序初始化,省略第一维大小
第一维长度省略初始化
例 int a[][3]={1,2,3,4,5};
1 2 3 4 5 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•引用形式
数组名[下标][下标]
a[1][0] a[1][1] a[1][2]
int a[3][4], (*p)[4];
p=a; a+2
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
•通过指向一维数组的指针变量来引用数组元素
p
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int i,j,(*p)[4]; for(p=a,i=0;i<3;i++,p++) for(j=0;j<4;j++) p[0][j] printf("%d ",*(*p+j)); printf("\n"); }
int *p;
int a[n];
int *p[n]; int (*p)[n]; int f();
int *p(); int (*p)(); int **p;
第五节 二维数组程序举例
• 将二维数组行列元素互换,存到另一个数组中 #include <stdio.h> 1 4 a= 1 2 3 1:a[0][0],b[0][0] main() b= 2 5 4 5 6 { int a[2][3]={{1,2,3},{4,5,6}}; 3 6 2:a[0][1],b[1][0] int b[3][2],i,j; 3:a[0][2],b[2][0] printf("array a:\n"); printf("array b:\n"); for(i=0;i<=1;i++) for(i=0;i<=2;i++) 4:a[1][0],b[0][1] { for(j=0;j<=2;j++) { for(j=0;j<=1;j++) 5:a[1][1],b[1][1] { printf("%5d",a[i][j]); printf("%5d",b[i][j]); b[j][i]=a[i][j]; printf("\n"); 6:a[1][2],b[2][1] } } printf("\n"); } }
如:int a[2][3]; 可以引用的数组元素有: a[0][0], a[0][1],a[0][2], a[1][0],a[1][1], a[1][2];
第三节 二维数组和指针
• 二维数组的地址
array int array[10];
对于一维数组: (1)数组名array表示数组的首地址, 即array[0]的地址; (2)数组名array是地址常量 (3)array+i是元素array[i]的地址 (4)array[i] *(array+i)
•指针数组用法举例
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int i,j, *p[3]; for(i=0;i<3;i++) { p[i]=a[i]; a[i][j] for(j=0;j<4;j++) printf("%d ",*(p[i]+j)); p[i][j] } * (a[i]+j) printf("\n"); }
例 int a[][3]={{1},{4,5}};
1 0 0 4 5 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•按元素排列顺序初始化
全部初始化
例 int a[2][3]={1,2,3,4,5,6};
1 2 3 4 5 6
• 数组元素的存放顺序
• 内存是一维的 • 按行序优先
如:int a[3][2];
int a[3][2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
a[0][0] a[1][0] a[2][0]
a[0][1] a[1][1] a[2][1]
二维数组的理解:特殊的一维数组
第二节 二维数组的初始化及引用
•分行部分初始化
部分初始化
例 int a[2][3]={{1,2ቤተ መጻሕፍቲ ባይዱ,{4}};
1 2 0 4 0 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•分行初始化,省略第一维的大小
第一维长度省略初始化
二维数组a由3个元素组成: a[0]、a[1]、a[2] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[0]
例 int a[3][4];
a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[2] a[2][0] a[2][1] a[2][2] a[2][3]
2010
2010 2014 23
第1行第0列元素地址 第1行第2列元素地址 第1行第2列元素值
*(a[1]+2),*(*(a+1)+2),a[1][2]
• 指向二维数组元素的指针变量
例 指向二维数组元素的指针变量
p
int a[3][4]; a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
a
2000 a[0]
2000 2004
a[0][0]
对二维数组 int a[3][4],有 • • a-----二维数组的首地址,即第0行的首地址 a+i-----第i行的首地址
a[0][1]
a[0][2] a[0][3]
a+1 2010
a[1]
2010 2014
•
a[i] *(a+i)------第i行第0列元素的地址
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
• 二维数组的地址
12
8 15 2
4
23 7 5
6
3 9 17
表示形式 a
含义
二维数组名,数组首地址 第0行第0列元素地址 第1行首地址
地址
2000 2000
a[0],*(a+0),*a
a+1 a[1],*(a+1) a[1]+2,*(a+1)+2,&a[1][2]
a[1]
a[2]
每个元素a[i]各包含4个元素 分别为:a[i][0], a[i][1], a[i][2], a[i][3],
第二节 二维数组的初始化及引用
•分行全部初始化
全部初始化
例 int a[2][3]={{1,2,3},{4,5,6}};
1 2 3 4 5 6
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][2] a[0][3] a[1][0] a[1][1] a[1][2]
p
*(*a+j)
p=a[0]; p=*a; p=&a[0][0]; p=&a[0];
p
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
第四节 二维数组名和指针数组作为实参
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
•通过指针数组来引用二维数组元素
若有以下定义:
int *p[3],a[3][4],i,j;
表示p是一个数组名,该数组类型为指针类 型,即数组的3个元素均为指针类型的数据。 注意: int *p[4]与int (*p)[4]代表不同的含 义。
a[0][2]
a[0][3] 2010 a[1][0] a[1][1] a[1][2] 2020 a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[1] a[1]+1 *(a+1)+1
2014
a+2 2020
a[2] a[2]+1 *(a+2)+1
2024
• 二维数组的地址
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•按元素排列顺序部分初始化
部分初始化
例 int a[2][3]={1,2,4};
1 2 4 0 0 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
定义 int i;
含义 定义整型变量i
p为指向整型数据的指针变量 定义含n个元素的整型数组a n个指向整型数据的指针变量组成的指针数组p p为指向含n个元素的一维整型数组的指针变量 f为返回整型数的函数 p为返回指针的函数,该指针指向一个整型数据 p为指向函数的指针变量,该函数返回整型数 p为指针变量,它指向一个指向整型数据的指针变量
• •
a+i &a[i],表示第i行首地址,指向行 a[i] *(a+i) &a[i][0],表示第i行第0列元 素地址,指向列
• 二维数组的地址
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
int a[3][4];
首元素地址表示: (1) a+1 行指针 (2) &a[1][0] 列指针 (3) a[1] (4) *(a+1) 元素地址表示: (1) &a[1][2] (2) a[1]+2 (3) *(a+1)+2 (4)&a[0][0]+1*4+2 二维数组元素表示形式: (1)a[1][2] (2)*(a[1]+2) (3)*(*(a+1)+2) (4)*(&a[0][0]+1*4+2)
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) { if((p-a[0])%4==0) printf("\n"); printf("%4d ",*p); } }
• 二维数组的地址
int a[3][4];
a
2000 a[0] a[0]+1 *(a+0)+1
*(a[0]+1) *(*(a+0)+1) 2000 2004
a[0][0] a[0][1]
对于二维数组: (1)a是数组名。 包含三个元素 : a[0],a[1],a[2] a+1 2010 (2)每个元素a[i]又是 一个一维数组,包含4 个元素: a[i][0]、 a[i][1]、 a[i][2]、 a[i][3]
•通过指向一维数组的指针变量来引用数组元素
定义形式:
如: int (*p)[4]; p的值是一维数组的 首地址,p是行指针 可让p指向二维数组的某一行 如:int a[3][4], (*p)[4]=a; 一维数组指针变量维数和 二维数组列数必须相同 ( )不能少 int (*p)[4]与int *p[4]不同
全国计算机等级考试
二级C语言
好好考
(www.haohaokao.com)
第12讲 二维数组与指针
二维数组的定义 数组元素的引用及初始化 二维数组和指针 二维数组名和指针数组作为实参 二维数组程序举例 真题分析
第一节 二维数组的定义
• 定义形式:
数据类型 数组名[常量表达式1][常量表达式2]
若 int a[3][4], (*p1)[4]=a;
int *p2=a[0]; 实参 数组名a 数组名a 指针变量p1 指针变量p1 指针变量p2 形参 数组名int x[][4] 指针变量int (*q)[4] 数组名int x[][4] 指针变量int (*q)[4] 指针变量int *q
•指针的数据类型小结
a[1][0] • a[i]+j *(a+i)+j -----第i行第j列元素的地址 a[1][1] • *(a[i]+j) *(*(a+i)+j) a[i][j]
a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a+2
2020
a[2]
2020 2024
数据类型 (*指针名)[数组大小]
•通过指向一维数组的指针变量来引用数组元素
a
a[0][0] a[0][1] a[0][2] a[0][3]
p p[0]+1或 *p+1 *(*p+1)或 (*p)[1]
p+1 p[1]+2或 *(p+1)+2 *(*(p+1)+2) p+2
int a[3][4], (*p)[4]=a; a+1
int a[3][4]; a[0][0] a[0][1] a[0][2]
p[0] p[1] p[2]
a[0][3] a[1][0] a[1][1] a[1][2]
a[1][3]
a[2][0] a[2][1]
p[0]=*a; p[0]=&a[0][0]; p[0]=a[0];
a[2][2]
a[2][3]
第二节 二维数组的初始化及引用
•按元素排列顺序初始化,省略第一维大小
第一维长度省略初始化
例 int a[][3]={1,2,3,4,5};
1 2 3 4 5 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•引用形式
数组名[下标][下标]
a[1][0] a[1][1] a[1][2]
int a[3][4], (*p)[4];
p=a; a+2
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
•通过指向一维数组的指针变量来引用数组元素
p
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int i,j,(*p)[4]; for(p=a,i=0;i<3;i++,p++) for(j=0;j<4;j++) p[0][j] printf("%d ",*(*p+j)); printf("\n"); }
int *p;
int a[n];
int *p[n]; int (*p)[n]; int f();
int *p(); int (*p)(); int **p;
第五节 二维数组程序举例
• 将二维数组行列元素互换,存到另一个数组中 #include <stdio.h> 1 4 a= 1 2 3 1:a[0][0],b[0][0] main() b= 2 5 4 5 6 { int a[2][3]={{1,2,3},{4,5,6}}; 3 6 2:a[0][1],b[1][0] int b[3][2],i,j; 3:a[0][2],b[2][0] printf("array a:\n"); printf("array b:\n"); for(i=0;i<=1;i++) for(i=0;i<=2;i++) 4:a[1][0],b[0][1] { for(j=0;j<=2;j++) { for(j=0;j<=1;j++) 5:a[1][1],b[1][1] { printf("%5d",a[i][j]); printf("%5d",b[i][j]); b[j][i]=a[i][j]; printf("\n"); 6:a[1][2],b[2][1] } } printf("\n"); } }
如:int a[2][3]; 可以引用的数组元素有: a[0][0], a[0][1],a[0][2], a[1][0],a[1][1], a[1][2];
第三节 二维数组和指针
• 二维数组的地址
array int array[10];
对于一维数组: (1)数组名array表示数组的首地址, 即array[0]的地址; (2)数组名array是地址常量 (3)array+i是元素array[i]的地址 (4)array[i] *(array+i)
•指针数组用法举例
main() { static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int i,j, *p[3]; for(i=0;i<3;i++) { p[i]=a[i]; a[i][j] for(j=0;j<4;j++) printf("%d ",*(p[i]+j)); p[i][j] } * (a[i]+j) printf("\n"); }
例 int a[][3]={{1},{4,5}};
1 0 0 4 5 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•按元素排列顺序初始化
全部初始化
例 int a[2][3]={1,2,3,4,5,6};
1 2 3 4 5 6
• 数组元素的存放顺序
• 内存是一维的 • 按行序优先
如:int a[3][2];
int a[3][2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
a[0][0] a[1][0] a[2][0]
a[0][1] a[1][1] a[2][1]
二维数组的理解:特殊的一维数组
第二节 二维数组的初始化及引用
•分行部分初始化
部分初始化
例 int a[2][3]={{1,2ቤተ መጻሕፍቲ ባይዱ,{4}};
1 2 0 4 0 0
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
第二节 二维数组的初始化及引用
•分行初始化,省略第一维的大小
第一维长度省略初始化
二维数组a由3个元素组成: a[0]、a[1]、a[2] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
a[0]
例 int a[3][4];
a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[2] a[2][0] a[2][1] a[2][2] a[2][3]
2010
2010 2014 23
第1行第0列元素地址 第1行第2列元素地址 第1行第2列元素值
*(a[1]+2),*(*(a+1)+2),a[1][2]
• 指向二维数组元素的指针变量
例 指向二维数组元素的指针变量
p
int a[3][4]; a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
a
2000 a[0]
2000 2004
a[0][0]
对二维数组 int a[3][4],有 • • a-----二维数组的首地址,即第0行的首地址 a+i-----第i行的首地址
a[0][1]
a[0][2] a[0][3]
a+1 2010
a[1]
2010 2014
•
a[i] *(a+i)------第i行第0列元素的地址
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
• 二维数组的地址
12
8 15 2
4
23 7 5
6
3 9 17
表示形式 a
含义
二维数组名,数组首地址 第0行第0列元素地址 第1行首地址
地址
2000 2000
a[0],*(a+0),*a
a+1 a[1],*(a+1) a[1]+2,*(a+1)+2,&a[1][2]
a[1]
a[2]
每个元素a[i]各包含4个元素 分别为:a[i][0], a[i][1], a[i][2], a[i][3],
第二节 二维数组的初始化及引用
•分行全部初始化
全部初始化
例 int a[2][3]={{1,2,3},{4,5,6}};
1 2 3 4 5 6
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][2] a[0][3] a[1][0] a[1][1] a[1][2]
p
*(*a+j)
p=a[0]; p=*a; p=&a[0][0]; p=&a[0];
p
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
第四节 二维数组名和指针数组作为实参