本帖最后由 风过无痕1989 于 2020-12-8 15:51 编辑
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
则数组 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]
对上述二维数组 a,虽然 a[ 0 ]、a 都是数组首地址,但二者指向的对象不同。
a[ 0 ] 是一维数组的名字,它指向的是一维数组 a[ 0 ] 的首元素 a[ 0 ][ 0 ],对其进行 “*” 运算,得到的是一维数组元素 a[ 0 ][ 0]的值,即 *a[ 0 ] 与 a[ 0 ][ 0 ]是同一个值。
而 a 是一个二维数组的名字,它指向的是二维数组a的首元素 a[ 0 ],对 a 进行 “*” 运算,得到的是一维数组 a[ 0 ] 的首地址,即 *a 与 a [0 ] 是同一个值。它的指针移动单位是“行”,所以 a+i 指向的是第 i 个行数组,即指向a[ i ]。
当用 int *p; 定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ] 对 p 赋值是正确的,而用 a 对 p 赋值是错误的。这一点请务必注意。