二维数组和指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运行结果:2,4,7,5,3
q
2 1 3 5
q 2 4 6
q
3 5 7 4 6 8
二维数组的指针作函数参数
用指向变量的指针变量 用指向一维数组的指针变量 用二维数组名
若int a[3][4]; int (*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 二维数组列数必须相同
a[0][3] a[1][0]
p+1 p[1]+2或 *(p+1)+2 *(*(p+1)+2) p+2
a[1][1]
a[1][2] a[1][3] a[2][0] a[2][1] a[2][2]
a+2
a[2][3]
例 一维数组指针变量举例 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++) printf("%d ",*(*p+j)); p[0][j]
对于二维数组: (1)a是数组名, 包含三个元素 a[0],a[1],a[2] (2)每个元素a[i] 又是一个一维 数组,包含4个 元素
a+2
2016
a[2]
2016
a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[2]+1 *(a+2)+1
基类型
2018
int a[3][4];
定义含n个元素的整型数组a
n个指向整型数据的指针变量组成的指针数组p p为指向含n个元素的一维整型数组的指针变量 f为返回整型数的函数 p为返回指针的函数,该指针指向一个整型数据 p为指向函数的指针变量,该函数返回整型数
p为指针变量,它指向一个指向整型数据的指针变量
例 下列定义的含义 (1)int *p[3]; (2)int (*p)[3]; (3)int *p(int); (4)int (*p)(int); (5)int *(*p)(int); (6)int (*p[3])(int); (7)int *(*p[3])(int);
a
2000
a[0]
a+12008
a[1]
a+22016
a[2]
对二维数组 int a[3][4],有 a[0][0] a-----二维数组的首地址,即第0行的首地址 2002 a+i-----第i行的首地址 a[0][1] a[i] *(a+i)------第i行第0列的元素地址 a[0][2] a[i]+j *(a+i)+j -----第i行第j列的元素地址 a[0][3] *(a[i]+j) *(*(a+i)+j) a[i][j] 2008 a[1][0] 2010 a[1][1] a+i=&a[i]=a[i]=*(a+i) =&a[i][0], a[1][2] 值相等,含义不同 a[1][3] a+i &a[i],表示第i行首地址,指向行 2016 a[2][0] a[i] *(a+i) &a[i][0],表示第i行第0列元 2018 素地址,指向列 a[2][1] 2000
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]
p
printf("\n");
} p=a[0]; p=a[0]; p=*a; p=*a; p=&a[0][0]; p=&a[0][0]; p=&a[0]; p=&a[0];
*(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]
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型变量中居于较大值的变量的地址 main() { int a=2,b=3; int *p; p=f3(a, b); printf("%d\n",*p); } int *f3(int x,int y) { if(x>y) return &x; else return &y; }
表示形式 a a[0],*(a+0),*a
含义 二维数组名,数组首地址
地址 2000 2000 2008 2008 2012 13
第0行第0列元素地址
第1行首地址 第1行第0列元素地址 第1行第2列元素地址 第1行第2列元素值
a+1 a[1],*(a+1) a[1]+2,*(a+1)+2,&a[1][2]
p=*a; p=*a; p=&a[0][0]; p=&a[0][0]; p=(int *)a; p=*(a+0); p=a; p=a;
a[1][3]
a[2][0] a[2][1]
百度文库
a[2][2]
a[2][3]
指向一维数组的指针变量 定义形式: 数据类型 (*指针名)[一维数组维数]; int a[3][4]; 例 int (*p)[4];
p
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
例 二维数组与指针运算 main() { int a[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}}; int i; p int (*p)[4]=a,*q=a[0]; p for(i=0;i<3;i++) { if(i==0) p (*p)[i+i/2]=*q+1; else p++,++q; } for(i=0;i<3;i++) printf("%d,",a[i][i]); printf("%d,%d\n",*((int *)p),*q); }
a[2][2] a[2][3]
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]
地址表示: (1) a+1 (2) &a[1][0] (3) a[1] (4) *(a+1) (5)(int *) (a+1)
行指针 列指针
int a[3][4];
a[0] a[0]+1 *(a+0)+1 2000 2002 a[0][0] a[0][1] a[0][2] 2008 a[1]+1 *(a+1)+1 2010 a[0][3]
*(a[0]+1) *(*(a+0)+1)
a
2000
a+1
2008
a[1]
a[1][0]
a[1][1] a[1][2]
二维数组与一维数组指针变量的关系 如 int a[5][10] 与 int (*p)[10]; 二维数组名是一个指向有10个元素的一维数组的指针常量 p=a+i 使 p指向二维数组的第i行 *(*(p+i)+j) a[i][j] 二维数组形参实际上是一维数组指针变量, 即 int x[ ][10] int (*x)[10] 变量定义(不是形参)时两者不等价 系统只给p分配能保存一个指针值的内存区(一般2字节);而 给a分配2*5*10字节的内存区
指针数组 指向一维数组的指针 返回指针的函数 指向函数的指针,函数返回int型变量 指向函数的指针,函数返回int 型指针 函数指针数组,函数返回int型变量 函数指针数组,函数返回int型指针
a p a[0][0] 可让p指向二维数组某一行 p[0]+1或 *p+1 p 的值是一维数组的 ( )a[3][4], 不能少(*p)[4]=a; a[0][1] *(*p+1)或 (*p)[1] 如 int 首地址, p 是行指针 int (*p)[4]与int *p[4]不同 a[0][2]
指针与二维数组
二维数组的地址
array int array[10];
对于一维数组: (1)数组名array表示数组的首地址,即array[0]的地址; (2)数组名array是地址常量 (3)array+i是元素array[i]的地址 (4)array[i] *(array+i)
行指针与列指针
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
地址表示: (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)
…...
2000
(main)
2002 2004
2006 2008 200A
2 3 200A **
变量a 变量b 指针变量p
不能返回形参或局部变量 的地址作函数返回值
…...
指针的数据类型
定义 int i; int *p; int a[n]; int *p[n]; int (*p)[n]; int f(); int *p(); int (*p)(); int **p; 定义整型变量i p为指向整型数据的指针变量 含义
(main)
2000 2002 2004 2006 2008 200A
COPY
2 3 **
(f3)
变量a 变量b 指针变量p
2 3
…...
变量x
变量y
例 写一个函数,求两个int型变量中居于较大值的变量的地址 main() { int a=2,b=3; int *p; p=f3(a,b); printf("%d\n",*p); } int *f3(int x,int y) { if(x>y) return &x; else return &y; }
q
2 1 3 5
q 2 4 6
q
3 5 7 4 6 8
二维数组的指针作函数参数
用指向变量的指针变量 用指向一维数组的指针变量 用二维数组名
若int a[3][4]; int (*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 二维数组列数必须相同
a[0][3] a[1][0]
p+1 p[1]+2或 *(p+1)+2 *(*(p+1)+2) p+2
a[1][1]
a[1][2] a[1][3] a[2][0] a[2][1] a[2][2]
a+2
a[2][3]
例 一维数组指针变量举例 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++) printf("%d ",*(*p+j)); p[0][j]
对于二维数组: (1)a是数组名, 包含三个元素 a[0],a[1],a[2] (2)每个元素a[i] 又是一个一维 数组,包含4个 元素
a+2
2016
a[2]
2016
a[1][3]
a[2][0] a[2][1] a[2][2] a[2][3]
a[2]+1 *(a+2)+1
基类型
2018
int a[3][4];
定义含n个元素的整型数组a
n个指向整型数据的指针变量组成的指针数组p p为指向含n个元素的一维整型数组的指针变量 f为返回整型数的函数 p为返回指针的函数,该指针指向一个整型数据 p为指向函数的指针变量,该函数返回整型数
p为指针变量,它指向一个指向整型数据的指针变量
例 下列定义的含义 (1)int *p[3]; (2)int (*p)[3]; (3)int *p(int); (4)int (*p)(int); (5)int *(*p)(int); (6)int (*p[3])(int); (7)int *(*p[3])(int);
a
2000
a[0]
a+12008
a[1]
a+22016
a[2]
对二维数组 int a[3][4],有 a[0][0] a-----二维数组的首地址,即第0行的首地址 2002 a+i-----第i行的首地址 a[0][1] a[i] *(a+i)------第i行第0列的元素地址 a[0][2] a[i]+j *(a+i)+j -----第i行第j列的元素地址 a[0][3] *(a[i]+j) *(*(a+i)+j) a[i][j] 2008 a[1][0] 2010 a[1][1] a+i=&a[i]=a[i]=*(a+i) =&a[i][0], a[1][2] 值相等,含义不同 a[1][3] a+i &a[i],表示第i行首地址,指向行 2016 a[2][0] a[i] *(a+i) &a[i][0],表示第i行第0列元 2018 素地址,指向列 a[2][1] 2000
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]
p
printf("\n");
} p=a[0]; p=a[0]; p=*a; p=*a; p=&a[0][0]; p=&a[0][0]; p=&a[0]; p=&a[0];
*(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]
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型变量中居于较大值的变量的地址 main() { int a=2,b=3; int *p; p=f3(a, b); printf("%d\n",*p); } int *f3(int x,int y) { if(x>y) return &x; else return &y; }
表示形式 a a[0],*(a+0),*a
含义 二维数组名,数组首地址
地址 2000 2000 2008 2008 2012 13
第0行第0列元素地址
第1行首地址 第1行第0列元素地址 第1行第2列元素地址 第1行第2列元素值
a+1 a[1],*(a+1) a[1]+2,*(a+1)+2,&a[1][2]
p=*a; p=*a; p=&a[0][0]; p=&a[0][0]; p=(int *)a; p=*(a+0); p=a; p=a;
a[1][3]
a[2][0] a[2][1]
百度文库
a[2][2]
a[2][3]
指向一维数组的指针变量 定义形式: 数据类型 (*指针名)[一维数组维数]; int a[3][4]; 例 int (*p)[4];
p
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
例 二维数组与指针运算 main() { int a[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}}; int i; p int (*p)[4]=a,*q=a[0]; p for(i=0;i<3;i++) { if(i==0) p (*p)[i+i/2]=*q+1; else p++,++q; } for(i=0;i<3;i++) printf("%d,",a[i][i]); printf("%d,%d\n",*((int *)p),*q); }
a[2][2] a[2][3]
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]
地址表示: (1) a+1 (2) &a[1][0] (3) a[1] (4) *(a+1) (5)(int *) (a+1)
行指针 列指针
int a[3][4];
a[0] a[0]+1 *(a+0)+1 2000 2002 a[0][0] a[0][1] a[0][2] 2008 a[1]+1 *(a+1)+1 2010 a[0][3]
*(a[0]+1) *(*(a+0)+1)
a
2000
a+1
2008
a[1]
a[1][0]
a[1][1] a[1][2]
二维数组与一维数组指针变量的关系 如 int a[5][10] 与 int (*p)[10]; 二维数组名是一个指向有10个元素的一维数组的指针常量 p=a+i 使 p指向二维数组的第i行 *(*(p+i)+j) a[i][j] 二维数组形参实际上是一维数组指针变量, 即 int x[ ][10] int (*x)[10] 变量定义(不是形参)时两者不等价 系统只给p分配能保存一个指针值的内存区(一般2字节);而 给a分配2*5*10字节的内存区
指针数组 指向一维数组的指针 返回指针的函数 指向函数的指针,函数返回int型变量 指向函数的指针,函数返回int 型指针 函数指针数组,函数返回int型变量 函数指针数组,函数返回int型指针
a p a[0][0] 可让p指向二维数组某一行 p[0]+1或 *p+1 p 的值是一维数组的 ( )a[3][4], 不能少(*p)[4]=a; a[0][1] *(*p+1)或 (*p)[1] 如 int 首地址, p 是行指针 int (*p)[4]与int *p[4]不同 a[0][2]
指针与二维数组
二维数组的地址
array int array[10];
对于一维数组: (1)数组名array表示数组的首地址,即array[0]的地址; (2)数组名array是地址常量 (3)array+i是元素array[i]的地址 (4)array[i] *(array+i)
行指针与列指针
a[1][3]
a[2][0] a[2][1]
a[2][2]
a[2][3]
地址表示: (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)
…...
2000
(main)
2002 2004
2006 2008 200A
2 3 200A **
变量a 变量b 指针变量p
不能返回形参或局部变量 的地址作函数返回值
…...
指针的数据类型
定义 int i; int *p; int a[n]; int *p[n]; int (*p)[n]; int f(); int *p(); int (*p)(); int **p; 定义整型变量i p为指向整型数据的指针变量 含义
(main)
2000 2002 2004 2006 2008 200A
COPY
2 3 **
(f3)
变量a 变量b 指针变量p
2 3
…...
变量x
变量y
例 写一个函数,求两个int型变量中居于较大值的变量的地址 main() { int a=2,b=3; int *p; p=f3(a,b); printf("%d\n",*p); } int *f3(int x,int y) { if(x>y) return &x; else return &y; }