gpt4 book ai didi

c++ - 帮助指针算术

转载 作者:太空狗 更新时间:2023-10-29 21:30:01 25 4
gpt4 key购买 nike

我一直在学习 C++ 进行测试,但我目前被指针算法困住了。

基本问题如下:

int numColumns = 3;
int numRows = 4;

int a[numRows][numColumns];

a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[1][0] = 4;
a[1][1] = 5;
a[1][2] = 6;
a[2][0] = 7;
a[2][1] = 8;
a[2][2] = 9;
a[3][0] = 10;
a[3][1] = 11;
a[3][2] = 12;

for (int i=numColumns-1; i>-1;i--)
{
cout << a[numRows-1][i] << endl;
}

一个非常简单的程序,打印较低的“矩阵行”。即 12、11、10。

现在我正在尝试用 int* 做同样的事情。

同学们告诉我的是这样想的:

array[i][j] == p[numColumns*i+j]

如果那是正确的,那么下面的内容不应该等同于我正在寻找的内容吗:

int* p = reinterpret_cast<int*> a;
for (int i=numColumns-1; i>-1;i--)
{
cout << p[numColumns*(numRows-1)+i] << endl;
}

谢谢。

最佳答案

int array[3][5] 不是 int array[3*5] 的抽象(在 C++ 语言中)。该标准表示二维数组(和一般的 N 维数组)是数组的数组。 array[3][5] 是一个包含三个元素的数组,其中每个元素都是一个包含 5 个元素(在本例中为整数)的数组。 C++ 的类型系统确实做出了这种区分。

根据 C++ 标准,数组 T array[N] 是一个连续的内存块,包含 N 个 T 类型的元素。这意味着一个多维数组,比方说 int array[ 3][5] 将是包含 3 个 int[5] 数组的连续内存块,每个 int[5] 数组是 5 个 的连续 block 整数

在我的机器上,内存最终的布局完全符合您的预期 - 与 int array[3*5] 相同。然而,由于类型系统(区分 int[]int[][]),处理内存的方式是不同的。这就是为什么您需要使用 reinterpret_cast 的原因,它基本上告诉您的编译器“获取此内存并且不进行任何转换,将其视为这种新类型”。

不过,我不完全确定这种内存布局是否得到保证。我在标准中找不到任何说明数组不能被填充的内容。如果它们可以被填充(同样,我不确定)那么 int[5] 数组实际上可能不是 5 个元素长(一个更好的例子是 char[5] ,我可以看到它被填充到 8 个字节)。

int*int** 之间也有明显的区别,因为后者不能保证连续的内存。

编辑:C++区分int[3*5]int[3][5]的原因是因为它要保证元素的顺序在内存中。在 C++ 中,int[0][1]int[0][2] 在内存中是 sizeof(int) 的。但是在 Fortran 中,例如,int[0][0]int[1][0]sizeof(int)内存,因为 Fortran 使用主要列表示。

这里有一张图来帮助解释:

0 1 2
3 4 5
6 7 8

可以做成一个像{0,1,2,3,4,5,6,7,8}这样的数组或者像这样的数组:{0,3,6,1,4,7 ,2,5,8}。

关于c++ - 帮助指针算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3578594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com