#include <stdio.h>
// 函数声明
int getElement(int (*matrix)[4], int i, int j);
int main() {
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int i = 1, j = 2;
int value = getElement(matrix, i, j);
printf("matrix[%d][%d] 的值为: %d\n", i, j, value);
return 0;
}
// 函数定义
int getElement(int (*matrix)[4], int i, int j) {
return *(*(matrix + i) + j);
}
二维数组与一维数组指针访问方式的不同
- 一维数组:在一维数组中,数组名本身就是一个指向数组首元素的指针。例如,
int arr[5];
,arr
就相当于 &arr[0]
,类型为 int*
。访问数组元素 arr[i]
等价于 *(arr + i)
,因为数组在内存中是连续存储的,arr + i
直接指向第 i
个元素的地址,再通过解引用 *
操作获取该元素的值。
- 二维数组:对于二维数组
int matrix[3][4];
,matrix
是指向第一行数组的指针,其类型为 int (*)[4]
,而不是 int**
。matrix + i
指向第 i
行数组的起始地址,*(matrix + i)
等价于 matrix[i]
,是指向第 i
行第一个元素的指针,类型为 int*
。要访问 matrix[i][j]
,需要先通过 *(matrix + i)
找到第 i
行首元素指针,再加上 j
偏移并解引用,即 *(*(matrix + i) + j)
。
内存布局体现
- 一维数组:一维数组的内存布局是简单的线性连续存储。例如
int arr[5]
,内存中依次存储 arr[0]
、arr[1]
、arr[2]
、arr[3]
、arr[4]
,相邻元素地址连续递增,步长为 sizeof(int)
。
- 二维数组:二维数组在内存中也是连续存储的,但逻辑上按行排列。对于
int matrix[3][4]
,先存储第一行的 4
个元素,再存储第二行,然后第三行。matrix[0]
、matrix[1]
、matrix[2]
这三行在内存中连续存储,每行内部的 4
个元素也连续存储。访问 matrix[i][j]
时,需要先找到第 i
行的起始地址(matrix + i
),再在该行内找到第 j
个元素(*(matrix + i) + j
)。