C语言中二维数组与指针
二维数组及其指针
固定长度的二维数组
假设我打算建立一个二维数组,并创建一个指针用于保存这个二维数组的地址,对于如下两种方法,
int arr[2][3] = {
0, 1, 2, 3, 4, 5};
int **ptr = arr;
int arr[2][3] = {
0, 1, 2, 3, 4, 5};
int (*ptr)[3] = arr;
使用第一种方法时,编译器会报错如下:int (*)[3] 型指针不能赋给 int ** 型指针
,这是因为对于建立的二维数组arr[2][3],当编译器去编译int arr[2][3]
指令的时候,内存中实际的分配情况如下:
由于arr是
int
型数组,每个内存块的大小为 4个字节
假设arr[0][0]
的地址为1000
,那么对于arr[0][i]
,当i加1时,地址也会相应增加 4个字节,也就是1004
由此类推:
数组下标 | 实际地址 | 数组下标 | 实际地址 | 数组下标 | 实际地址 |
---|---|---|---|---|---|
arr[0][0] | 1000 | arr[0][1] | 1004 | arr[0][2] | 1008 |
arr[1][0] | 1012 | arr[1][1] | 1016 | arr[1][2] | 1020 |
同时,对于arr[2][3]
,可以理解为含有 两个 各包含了三个int
元素的 一维数组 的数组, 这样看来:
arr[0]
实际上代表着这个二维数组中所存储的第一个一维数组;
arr[1]
实际上代表着这个二维数组中所存储的第二个一维数组。
若是按着这个思路继续理解下去,arr[0]
代表着一个一维数组,而arr[0][i]
又可以从这个数组中取值,那么是不是可以这样理解:arr[0]
为一个指向这个一维数组的指针呢?如下的代码可以对这个猜想进行验证:
#include <stdio.h>
int main() {
int arr[2][3] = {
0, 1, 2, 3, 4, 5}