我如何计算大小为1000 x 1000的2D数组中2个元素之间的步幅? C ++

问题描述 投票:0回答:1

我正在尝试查找索引[0][0][0][1]之间以及[0][0][1][0]之间的跨度,以尝试了解它的工作原理,因此,我将打印输出的内存地址他们每个人,然后有所不同,这就是我所理解的大步前进。

即:[0][0]处的内存地址为0x00E8C140[0][1]处的内存地址为0x00E8C148,因此跨度应为8,对吧? (数组是2D数组大小[1000][1000]

for (int y = 0; y < 1000; ++y)
{
    for (int x = 0; x < 1000; ++x)
    {
        Array[y][x] = (x == y) ? 1.0 : 0.0;
        if (y == 0 && x == 0) {
            printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
        }
        if (y == 0 && x == 1) {
            printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
        }
        if (y == 1 && x == 0) {
            printf("&Array[%d][%d]=%p\n", y, x, &Array[y][x]);
        }
    }
}

输出:

&Array[0][0]=00E8C140
&Array[0][1]=00E8C148
&Array[1][0]=00E8E080

我是说这对我来说很有意义,但是我真的不确定我是否正确地打印了内存地址,因为它的数量很大。我以为基地址([0][0])大概是1000左右。

c++ arrays multidimensional-array memory-address stride
1个回答
0
投票

array [0] [1]和array [0] [0]之间的差是一个数组元素。差异的大小与数组元素的大小无关。因此,对于一个包含char的数组,差异将为1;对于包含long的数组,其差异将为64位计算机上的8。

array [1] [0]和array [0] [0]之间的差是,一行中有许多数组元素(对于1000 x 1000的数组,它将是1000个数组元素)。差异的大小是将数组元素的大小乘以一行中的数组元素的数量的乘积。因此,对于包含char的1000 x 1000数组,差异将为1 x 1000,而对于包含long的相同大小的数组,则在64位计算机上为8 x 1000。

这里是使用10 x 10数组的示例程序:

#include <stdio.h>

int main()
{
    #define ARRAY_WIDTH 10
    #define ARRAY_HEIGHT 10
    char CArray[ARRAY_HEIGHT][ARRAY_WIDTH];
    short SArray[ARRAY_HEIGHT][ARRAY_WIDTH];
    long LArray[ARRAY_HEIGHT][ARRAY_WIDTH];

    printf("&CArray[0][1] - &CArray[0][0] = %ld (%p-%p)  sizeof(char) = %lu\n",
            (long)(&CArray[0][1]) - (long)(&CArray[0][0]), &CArray[0][1], &CArray[0][0], sizeof(char));
    printf("&SArray[0][1] - &SArray[0][0] = %ld (%p-%p)  sizeof(short) = %lu\n",
            (long)(&SArray[0][1]) - (long)(&SArray[0][0]), &SArray[0][1], &SArray[0][0], sizeof(short));
    printf("&LArray[0][1] - &LArray[0][0] = %ld (%p-%p)  sizeof(long) = %lu\n",
            (long)(&LArray[0][1]) - (long)(&LArray[0][0]), &LArray[0][1], &LArray[0][0], sizeof(long));

    printf("&CArray[1][0] - &CArray[0][0] = %ld (%p-%p)  sizeof(char) * ARRAY_WIDTH = %lu\n",
            (long)(&CArray[1][0]) - (long)(&CArray[0][0]), &CArray[1][0], &CArray[0][0], sizeof(char) * ARRAY_WIDTH);
    printf("&SArray[1][0] - &SArray[0][0] = %ld (%p-%p)  sizeof(short) * ARRAY_WIDTH = %lu\n",
            (long)(&SArray[1][0]) - (long)(&SArray[0][0]), &SArray[1][0], &SArray[0][0], sizeof(short) * ARRAY_WIDTH);
    printf("&LArray[1][0] - &LArray[0][0] = %ld (%p-%p)  sizeof(long) * ARRAY_WIDTH = %lu\n",
            (long)(&LArray[1][0]) - (long)(&LArray[0][0]), &LArray[1][0], &LArray[0][0], sizeof(long) * ARRAY_WIDTH);

    return 0;
}

此程序产生以下输出(记住我的数组只有10 x 10):

&CArray[0][1] - &CArray[0][0] = 1 (0x7ffcff4045e1-0x7ffcff4045e0)  sizeof(char) = 1                                                           
&SArray[0][1] - &SArray[0][0] = 2 (0x7ffcff404652-0x7ffcff404650)  sizeof(short) = 2                                                          
&LArray[0][1] - &LArray[0][0] = 8 (0x7ffcff404728-0x7ffcff404720)  sizeof(long) = 8                                                           
&CArray[1][0] - &CArray[0][0] = 10 (0x7ffcff4045ea-0x7ffcff4045e0)  sizeof(char) * ARRAY_WIDTH = 10                                           
&SArray[1][0] - &SArray[0][0] = 20 (0x7ffcff404664-0x7ffcff404650)  sizeof(short) * ARRAY_WIDTH = 20                                          
&LArray[1][0] - &LArray[0][0] = 80 (0x7ffcff404770-0x7ffcff404720)  sizeof(long) * ARRAY_WIDTH = 80                                           

在这里看看:https://onlinegdb.com/BJwpNDBYB

© www.soinside.com 2019 - 2024. All rights reserved.