cnkizy 发表于 2022-5-6 09:40:08

二维数组内存地址疑惑

本帖最后由 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");
        }

 



basketmn 发表于 2022-5-6 09:50:10

*((*arr + 0 )+0)

xueCxueCxueJava 发表于 2022-5-6 11:29:58

10=一份作业{:10_254:}{:10_243:}谢谢

风车呼呼呼 发表于 2022-5-6 12:50:38

数组首地址+i,加的是i * 一个数组元素的长度
int a = {0, 1}.*(a+1)访问的是1,移动的是一个int型长度

二维数组可以看作是一维数组,一维数组里的每个数组元素又是一维数组,你加1加的是整个一维数组的长度

1molHF 发表于 2022-5-6 13:20:05

*((*arr + 0 )+0)

1050293757 发表于 2022-5-6 13:22:19

{:5_109:}

cnkizy 发表于 2022-5-6 18:36:37

basketmn 发表于 2022-5-6 09:50
*((*arr + 0 )+0)

谢谢{:5_106:}

cnkizy 发表于 2022-5-6 18:37:09

xueCxueCxueJava 发表于 2022-5-6 11:29
10=一份作业谢谢

啥意思 不太懂{:5_109:}

cnkizy 发表于 2022-5-6 18:37:52

风车呼呼呼 发表于 2022-5-6 12:50
数组首地址+i,加的是i * 一个数组元素的长度
int a = {0, 1}.*(a+1)访问的是1,移动的是一个int型长 ...

{:5_106:}谢谢

cnkizy 发表于 2022-5-6 18:38:25

1molHF 发表于 2022-5-6 13:20
*((*arr + 0 )+0)

{:5_109:}{:5_106:}
页: [1]
查看完整版本: 二维数组内存地址疑惑