猿问

C / C ++多维数组内部

C / C ++多维数组内部

我有一个关于C / C ++如何在内部存储使用符号声明的多维数组的问题foo[m][n]。我不是在质疑指针的纯指针等等......因为速度原因,我在问...


如果我错了,请纠正我,但语法上foo是一个指针数组,它们本身指向一个数组


int foo[5][4]

*(foo + i)           // returns a memory address

*( *(foo + i) + j)    // returns an int

我从很多地方听说过C / C ++编译器foo[m][n]在幕后转换为一维数组(计算所需的一维索引i * width + j)。但是如果这是真的那么以下就可以了


*(foo + 1)          // should return element foo[0][1]

因此,我的问题foo[m][n]是:(总是吗?)存储在内存中作为平面一维数组是真的吗?如果是这样,为什么上面的代码如图所示。


慕容3067478
浏览 497回答 2
2回答

一只名叫tom的猫

是的,C / C ++将多维(矩形)数组存储为连续的内存区域。但是,您的语法不正确。要修改元素foo[0][1],以下代码将起作用:*((int *)foo+1)=5;显式类型转换是必要的,因为foo+1,是一样的&foo[1]它是不是在所有的同样的事情foo[0][1]。*(foo+1)是指向平坦存储区中第五个元素的指针。换句话说,*(foo+1)基本上是foo[1]和**(foo+1)是foo[1][0]。以下是一些二维数组的内存布局:
随时随地看视频慕课网APP
我要回答