二维数组内存地址疑惑
本帖最后由 cnkizy 于 2022-6-21 14:21 编辑#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, *(arr1 + i));
}
printf("\r\n");
return 0;
}
其计算结果是
数组元素内存地址为:首地址 + 元素索引
那么二维数组为啥不能用:首地址 + i*列数 + j的方式获取元素呢?
#include <iostream>
using namespace std;
int main()
{
int arr = { 1,2,3,4,5 };
printf("%p = %p \r\n ", &arr, (arr + 0 * 5 + 0));
printf("%d = %d \r\n ", arr, *(arr + 0 * 5 + 0));
return 0;
}
N天后续补坑
本来想删了 {:10_277:} ,但还是来补坑吧。
为啥我上面的错了,原因
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");
}
*((*arr + 0 )+0) 10=一份作业{:10_254:}{:10_243:}谢谢 数组首地址+i,加的是i * 一个数组元素的长度
int a = {0, 1}.*(a+1)访问的是1,移动的是一个int型长度
二维数组可以看作是一维数组,一维数组里的每个数组元素又是一维数组,你加1加的是整个一维数组的长度 *((*arr + 0 )+0) {:5_109:} basketmn 发表于 2022-5-6 09:50
*((*arr + 0 )+0)
谢谢{:5_106:} xueCxueCxueJava 发表于 2022-5-6 11:29
10=一份作业谢谢
啥意思 不太懂{:5_109:} 风车呼呼呼 发表于 2022-5-6 12:50
数组首地址+i,加的是i * 一个数组元素的长度
int a = {0, 1}.*(a+1)访问的是1,移动的是一个int型长 ...
{:5_106:}谢谢 1molHF 发表于 2022-5-6 13:20
*((*arr + 0 )+0)
{:5_109:}{:5_106:}
页:
[1]