鱼C论坛

 找回密码
 立即注册
查看: 1518|回复: 9

[已解决]二维数组内存地址疑惑

[复制链接]
发表于 2022-5-6 09:40:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;
}
其计算结果是
1.png

数组元素内存地址为:首地址 + 元素索引

那么二维数组为啥不能用:首地址 + 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;
}
2.png


N天后续补坑
&#8203;
本来想删了 ,但还是来补坑吧。

为啥我上面的错了,原因

1、少算了int长度。2、直接对二维数组指针做操作,长度需要计算。

二维数组的索引:

*(a+i)&#160; 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");
        }

&#160;

&#8203;

最佳答案
2022-5-6 12:50:38
数组首地址+i,加的是i * 一个数组元素的长度
int a[2] = {0, 1}.  *(a+1)访问的是1,移动的是一个int型长度

二维数组可以看作是一维数组,一维数组里的每个数组元素又是一维数组,你加1加的是整个一维数组的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-6 09:50:10 | 显示全部楼层

回帖奖励 +10 鱼币

*((*arr + 0 )+0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 11:29:58 | 显示全部楼层

回帖奖励 +10 鱼币

10=一份作业谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 12:50:38 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

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

二维数组可以看作是一维数组,一维数组里的每个数组元素又是一维数组,你加1加的是整个一维数组的长度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 13:20:05 | 显示全部楼层

回帖奖励 +10 鱼币

*((*arr + 0 )+0)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 13:22:19 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-6 18:36:37 | 显示全部楼层

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 18:37:09 | 显示全部楼层

啥意思 不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 18:37:52 | 显示全部楼层
风车呼呼呼 发表于 2022-5-6 12:50
数组首地址+i,加的是i * 一个数组元素的长度
int a[2] = {0, 1}.  *(a+1)访问的是1,移动的是一个int型长 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 18:38:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表