- 获取
arr[1][2]
的值:
- 已知指针
p
指向arr[0][0]
,二维数组arr
可以看作是按行存储的。在int arr[3][4]
中,每个int
类型的数据占4个字节(假设int
为4字节)。
- 要访问
arr[1][2]
,先计算从arr[0][0]
到arr[1][0]
的偏移,因为一行有4个int
类型的数据,所以偏移量为4 * sizeof(int)
。
- 再从
arr[1][0]
到arr[1][2]
,偏移量为2 * sizeof(int)
。
- 总的偏移量为
(1 * 4 + 2) * sizeof(int)
。
- 代码如下:
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int *p = &arr[0][0];
int value = *(p + 1 * 4 + 2);
printf("arr[1][2]的值为: %d\n", value);
return 0;
}
- 地址偏移原理:
- 在C语言中,二维数组在内存中是按行顺序存储的。对于
int arr[m][n]
,arr[i][j]
的地址计算公式为:&arr[0][0] + (i * n + j) * sizeof(int)
。
- 这里
i
表示行号,j
表示列号。从起始地址&arr[0][0]
开始,先跳过i
行,每行有n
个元素,每个元素大小为sizeof(int)
,所以偏移i * n * sizeof(int)
,然后再在第i
行中偏移j
个元素的大小,即j * sizeof(int)
,两者相加就是arr[i][j]
相对于arr[0][0]
的地址偏移量。通过指针p
,可以利用这种偏移量计算来访问数组中的任意元素,p + offset
就是目标元素的地址,再通过解引用*(p + offset)
获取其值。