
指针数组模拟二维数组#includestdio.hintmain(){intarr1[]{1,2,3,4,5};intarr2[]{2,3,4,5,6};intarr3[]{3,4,5,6,7};int*arr[3]{arr1,arr2,arr3};inti0;for(i0;i3;i){intj0;for(j0;j5;j){printf(%d ,arr[i][j]);}putchar(\n);}return0;}原理定义了三个一维数组。定义一个指针数组存放这三个数组的地址也就是它们的首元素地址。对arr[i][j]的理解arr[i]表示找到第 i 个一维数组第 i 行[j]用于定位这个数组中的第 j 个元素因此就可以按顺序遍历这三个数组每打印完一行就换行。arr[i][j]等价于*(arr[i] j)也可以写成*(*(arr i) j)。对*(arr[i] j)的理解先取arr[i]它表示第 i 个数组的首地址比如arr[0]指向arr1的首地址然后再对这个地址做偏移 j也就是从该数组的起始位置向后移动 j 个元素最后用*解引用得到对应元素的值。例如arr[0]对应的是arr1的地址则*(arr[0] 2)就表示arr1[2]也就是说先定位到第 i 个数组的起始位置再根据 j 定位该数组中的某个元素。这种方式本质上就是把多个一维数组的首地址保存在一个指针数组中然后再通过arr[i][j]的方式模拟二维数组的访问。补充这里的arr[i]是一个指针arr[i][j]实际上就是“先取某一行的首地址再访问那一行中的第 j 个元素”。这样就能用二维数组的写法来访问多个一维数组。对*(*(arr i) j)的理解arr i找到指针数组arr中第 i 个位置也就是第 i 个指针在arr里的地址。*(arr i)取出第 i 个位置里的值这个值就是第 i 个一维数组的首地址也就是arr[i]。*(arr i) j在该首地址上向后移动 j 个元素定位该行的第 j 个元素的地址。最外层的*对上一步得到的地址做解引用得到该元素的值。合起来*(*(arr i) j)的意思就是先取第 i 个数组的起始地址arr[i]再在它上面偏移 j 个元素最后解引用得到第 i 行第 j 列的值。例如arr[0]对应arr1的首地址所以*(*(arr 0) 2)就是arr1[2]。