附有指针p与二维数组a的关系(建议收藏):
(一)、对于int[3][4],*p=a[0];,指针p与二维数组的关系如下(建议收藏):
地址描述 | 意义 | 数组元素描述 | 意义 |
a、*a、a[0]、&a[0][0]、p | a的首地址 | **a、*p、*a[0]、a[ 0][0] | a[0][0]的值 |
*a+1、a[0]+1、&a[0][0]+1、p+1 | a[0][1]的地址 | *(*a+1)、*(p+1)、a[0][1]、*(a[0]+1)、 *(&a[0][0]+1) | a[0][1]的值 |
a+1 | a[1][0]的地址 | **(a+1)、*a[1]、a[1][0] | a[1][0]的值 |
a+i | a[i][0]的地址 | **(a+i)、*a[ i ]、a[ i ][0] | a[ i ][0]的值 |
*a+i*4+j、p+i*4+j、a[0]+i*4+j、&a[0][0]+i*4+j、&a[ i ][ j ] | a[i][j]的地址 | *(*a+i*4+j)、*(p+i*4+j)、*(a[0]+i*4+j)、a[ i ][ j ]、*(&a[0][0]+ i*4+j) | a[ i ][ j ]的 |
(二)、分析:
(1)、设p是指向数组a的指针变量,
若有:p=a[0];
则p+j将指向a[0]数组中的元素a[0][j]。
(2)、由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如: p+i*N+j
1.元素a[i][j]相应的用指针表示为:*( p+i*N+j)
2.同样,a[i][j]也可使用指针下标法表示,如:p[i*N+j]
(3)、例如,有如下定义:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:int *p=a[0];
则:
- 数组a的元素a[1][2]对应的指针为:p+1*4+2
- 元素a[1][2]也就可以表示为:*( p+1*4+2)
- 用下标表示法,a[1][2]表示为:p[1*4+2]
(三)、特别说明(对指针p与二维数组对照表的分析):
对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象含义不同。
a[0]是一维数组的名字,它指向的是a[0]数组的首元素地址,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;
而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组的首地址,如a+1为a[1][0]对应的地址,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。