第15讲 二维数组与指针
第15讲 二维数组与指针
指针与二维数组 define M 2 define n3 int b[MiN] 两种观点: 看成一个一维数组 看成数组的数组
2 指针与二维数组 #define M 2 #define N 3 … int b[M][N]; ▪ 两种观点: ▪ 看成一个一维数组 ▪ 看成数组的数组
将二维数组看成一个一维数组 int b[M]N]: 维数组b相当于一个有6个元 的一维数组 b|o|1 若有int*p=&b[o][o] 或p=bo]:(总之是列地址) P[2] b012l b[[门相对于数组起始地址的偏P[3] 移量为产N+j P[4] Cb[11[11 则P护N+门]或(p+产N+)表示每 轮数想元素 3
3 将二维数组看成一个一维数组 ▪ int b[M][N]; ▪ 二维数组b相当于一个有6个元素 的一维数组 ▪ 若有int *p=&b[0][0]; ▪ 或p=b[0] ;(总之是列地址) ▪ b[i][j]相对于数组起始地址的偏 移量为i*N+j ▪ 则p[i*N+j]或*(p+i*N+j)表示每 一个数组元素。 b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] p P[0] P[2] P[3] P[4] P[5] P[1]
填空题:求二维数组元素的和鼠 Include void maino 〔ita34-1357911.13,171921,23 int i.j. sum=o, * p= a[o]ox &a[d for〔i=0:3:i++ PrOJ for(=0; j<4: j++) P[] aol P[2] sum+=p[3+] P[3] printf sum=%4d", sum): P[4 P[5] Fa[lil 4
4 填空题:求二维数组元素的和 #include void main() { int a[3][4]={1,3,5,7,9,11,13,17,19,21,23}; int i,j,sum=0,*p= ; for ( i=0 ;i<3;i++) for(j=0; j<4; j++) { sum+=p[ ]; } printf(“sum=%4d",sum); } a[0]或&a[0][0] i*3+j a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] …… P[0] P[2] P[3] P[4] P[5] …… P[1] p
填空:输出二维数组元输出果5 #include 9111315 17192123 void maino inta[3][4]=1,3579,11,1317192123} int*p=a[o或&aroo]: for( : p<a[o]+12: p++) i(p-qo1)%4==0) 31alol1l rinf(\n") 5 printf"%4d",中) 7 9 13
5 #include void main() { int a[3][4]={1,3,5,7,9,11,13,17,19,21,23}; int *p= ; for ( ; ;p++) { if (( )%4==0) printf("\n"); printf("%4d", ); } } 填空:输出二维数组元素的值 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] …… p 1 3 5 7 9 11 13 输出结果: 1 3 5 7 9 11 13 15 17 19 21 23 a[0]或&a[0][0] p<a[0]+12 p-a[0] *p
将二维数组看成数组的数组 行地址 b|0 *(b+0 b+1 (b+1) 再将二维数组b看成由 b0J,b[两个元素组成的一维 数组,注意:b|0],b1存放的 是每行的首地址 6
6 将二维数组看成数组的数组 行地址 b+0 b+1 b[1] b[0] b 一维数组b[0] b[1][0] b[1][1] b[1][2] b[0][0] b[0][1] b[0][2] 一维数组b[1] 将二维数组的每一行看成一维数组 *(b+1) *(b+0) 列地址 b[0]+0 b[0]+1 b[0]+2 列地址 b[1]+0 b[1]+1 b[1]+2 *(b[0]+0) *(b[0]+1) *(b[0]+2) *(b[1]+0) *(b[1]+1) *(b[1]+2) 再将二维数组 b 看 成 由 b[0],b[1]两个元素组成的一维 数组,注意: b[0],b[1]存放的 是每行的首地址
指针与二维数组 列地址 行地址 b0]+0 b|0+1b|01+2 (b+0)+0*(b+0)+1“(b+0)+2 b+0 维数组bb010 b[01[1] b(01[21 b|0 (*(b+0)+0)*(*b+0)+1)*(*(b+0)+2) (b+0 列地址 b[1+0 b1H+1b1+2 b+1 *(b+1)+0*(h+1+1*(b+1+2 b1 维数组 b(1] b(11101 b1b|2 (b+1 ((+】+0)*((b+1)+1)*((b+1)+2) 一维数组b 7
7 指针与二维数组 行地址 b+0 b+1 一维数组b b b[1] *(b+1) b[0] *(b+0) 列地址 b[0]+0 b[0]+1 b[0]+2 *(b+0)+0 *(b+0)+1 *(b+0)+2 一维数组b[0] b[1]+0 b[1]+1 b[1]+2 *(b+1)+0 *(b+1)+1 *(b+1)+2 列地址 b[1][0] b[1][1] b[1][2] *(*(b+1)+0) *(*(b+1)+1) *(*(b+1)+2) b[0][0] b[0][1] b[0][2] *(*(b+0)+0) *(*(b+0)+1) *(*(b+0)+2) 一维数组b[1]
指针与二维数组 代表二维数组的首地址,指向第O行的首地址(行地址) b+i 指向第行的首地址(行地址) (b+i)或b[j 代表第行第0列的地址(列地址) (b+)+或b[j+j 代表第i行第j列的地址(列地址) ))或b[jj 表第行第j列的元素(数组元素)
8 指针与二维数组 ▪ b ▪ 代表二维数组的首地址,指向第0行的首地址(行地址) ▪ b+i ▪ 指向第i行的首地址(行地址) ▪ *(b+i) 或 b[i] ▪ 代表第i行第0列的地址(列地址) ▪ *(b+i)+j 或 b[i]+j ▪ 代表第i行第j列的地址(列地址) ▪ *(*(b+i)+j ) 或 b[i][j] ▪ 代表第i行第j列的元素(数组元素)
用数组名引用二维数组元素 元素b[jj的几种等价的引用方式 bLj] a^(b[j]+j) 如何用指针变量引 *C(b+)+j 用二维数组元素? ((b+i)Li
9 用数组名引用二维数组元素 ▪ 元素b[i][j]的几种等价的引用方式 ▪ b[i][j] ▪ *(b[i]+j) ▪ *(*(b+i)+j) ▪ (*(b+i))[j] •如何用指针变量引 用二维数组元素?
二维数组与指针 用指针指向二维数组,有两种指针: 列指针,这种指针指向二维数组的每一个 元素,它每加1,指向二维数组的下一个数 组元素。 行指针,这种指针指向二维数组的行,它 每加1,指向二维数组的下一行。 上边两种指针分别对应着对二维数组的 两种看法。 10
10 二维数组与指针 ▪ 用指针指向二维数组,有两种指针: ▪ 列指针,这种指针指向二维数组的每一个 元素,它每加1,指向二维数组的下一个数 组元素。 ▪ 行指针,这种指针指向二维数组的行,它 每加1,指向二维数组的下一行。 ▪ 上边两种指针分别对应着对二维数组的 两种看法