|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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[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");
}
 
​
数组首地址+i,加的是i * 一个数组元素的长度
int a[2] = {0, 1}. *(a+1)访问的是1,移动的是一个int型长度
二维数组可以看作是一维数组,一维数组里的每个数组元素又是一维数组,你加1加的是整个一维数组的长度
|
|