确定内存中指针的分隔数

时间:2016-10-09 21:48:13

标签: c arrays pointers

我对增加数组的指针然后测量指针位置的字节差异感到困惑。

我知道当通过多维数组移动时,指针*p将按数据类型的大小递增。但是,当使用数组thisArray时:

int thisArray[ 7 ][ 4 ];

应该如何评估thisArrray + 1?我是否增加行和列?

我想知道这些指针将在内存中分开多少个字节。

我知道确切的答案将取决于平台。我正在寻求解决方法,而不是确切的答案。

因为我无法在评论中格式化代码:我把它放在这里:

//使用sizeof

#include <stdio.h>

int main(void) {

int tbl[ 7 ][ 4 ];

// Size of tbl
int x = sizeof(*tbl);
printf ( "%d\n" , x);

// Size of tbl + 1;
int y = sizeof(*tbl+1);
printf( "%d\n", y);

//Size apart in bytes
int z = y - x;
printf("%d\n", z);

return 0;
}

2 个答案:

答案 0 :(得分:5)

  

如何评估thisArrray + 1?

thisArray衰减到指针时,指针类型为int (*)[4]thisArray+1的类型相同。

  

我是否增加行和列?

如果使用行和列结构查看thisArray的内存,则可以:

thisArray ->       +----+----+----+----+
                   |    |    |    |    |
thisArray + 1 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 2 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 3 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 4 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 5 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 6 ->   +----+----+----+----+
                   |    |    |    |    |
thisArray + 7 ->   +----+----+----+----+

如果要使用数组的遍历元素,可以使用索引或指针。

遍历使用索引:

for ( int i = 0; i < 7; ++i )
{
   for ( int j = 0; j < 4; ++j )
   {
       // Use thisArray[i][j];
   }
}

使用指针遍历:

for ( int (*ptr1)[4] = thisArray; ptr1 < thisArray+7; ++ptr1 )
{
   for ( int* ptr2 = *ptr1; ptr2 < *ptr1 + 4; ++ptr2 )
   {
       // Use *ptr2
   }
}

从可读性的角度来看,使用索引遍历数组更加直观。我强烈建议使用它。

答案 1 :(得分:0)

当您单独使用索引时,它将乘以类型定义的大小。假设你的int是4个字节,那么每个int在int类型的数组中将相隔4个字节。这就是你的第二个或内部索引(4)的工作方式。

查看这个好答案: How are multi-dimensional arrays formatted in memory?

要理解第一个索引(7),请注意二维数组实际上是一个数组数组。在我们的示例中,第二个维度是四个元素宽,因此对于第一个索引的每个增量,您将跳过4x4 = 16个字节。所以thisArray是内存中的地址,[2] [3]会增加2x16 + 3x4 = 44个字节。这是内存中4 + 4 + 3 =第11个连续点,每个点是4个字节。