#include <iostream>
using namespace std;
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr1_len = sizeof(arr1) / sizeof(int);
for (size_t i = 0; i < arr1_len; i++) {
printf("%d == %d\t", arr1[i], *(arr1 + i));
}
printf("\r\n");
return 0;
}
计算结果
数组元素内存地址为:首地址 + 元素索引
那么二维数组为啥不能用:首地址 + i*列数 + j 的方式获取元素呢?
#include <iostream>
using namespace std;
int main()
{
int arr[2][5] = { 1,2,3,4,5 };
printf("%p = %p \r\n ", &arr[0][0], (arr + 0 * 5 + 0));
printf("%d = %d \r\n ", arr[0][0], *(arr + 0 * 5 + 0));
return 0;
}
N天后续
本来想删了 /狗头,但还是来补坑吧。
为啥我上面的错了,原因
1、少算了int长度。2、直接对二维数组指针做操作,长度需要计算。
二维数组的索引:
*(a+i) i值的单位是一维长度,假设如下图,那么一维长度是5*int。1个i 就是 5*4 = 20
设a地址为1000,i为1,那么 *(a+i) 会访问 1020 这个地址。
*(*(a+i) + j) j值得单位就是int,一个j 就是4。
写法二:
直接对a操作,地址会根据一维长度计算。那强转成int*,就可以直接算了。
for (int i = 0; i < 3; i++) {
for (int j = i; j < 5 + i; j++) {
printf("%d ", *((int*)a + i * sizeof(int) + j));
}
printf("\n");
}