#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int *ptr[3];
for (int i = 0; i < 3; i++) {
ptr[i] = arr[i];
}
// 输出验证
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
return 0;
}
指针与数组原理
- 地址计算:
- 在二维数组
int arr[3][4]
中,arr
是数组名,代表首元素地址,也就是arr[0]
的地址。arr[0]
本身又是一个包含4个int
类型元素的数组,其地址也是arr[0][0]
的地址。对于arr[i][j]
,其地址计算为&arr[0][0] + i * 4 + j
(假设int
类型占4个字节),因为每一行有4个int
类型元素。
- 对于指针数组
int *ptr[3]
,ptr
是数组名,代表首元素地址,即ptr[0]
的地址。ptr[i]
存储的是arr[i]
的地址,也就是arr[i][0]
的地址。
- 数据访问方式变化:
- 对于二维数组
arr
,可以使用arr[i][j]
的方式访问数据,编译器会根据上述地址计算方式找到对应的数据。
- 对于指针数组
ptr
,ptr[i]
是一个指针,指向arr[i]
的起始地址,ptr[i][j]
等同于*(ptr[i] + j)
,先找到ptr[i]
指向的地址,然后偏移j
个int
类型的位置来访问数据。