c++ - 如何在没有 [] 运算符的情况下正确取消引用多维数组

标签 c++ multidimensional-array dereference

所以,我想出了如何取消引用这样的多维数组:

#include <tchar.h>
#include <iostream>

wchar_t g_pppwcSymbol[2][3][4];

int main(int argc, TCHAR **argv) 
 {
     (* (*( (*(g_pppwcSymbol+1) )+2 )+3 ) ) = L'K';
     std::wcout<<g_pppwcSymbol[1][2][3];
     std::wcin.get();
     return 0;
 }

输出:K

但是,我也听说编译器将其转换为一维数组,对吗?这将意味着所有 wchar_t 元素在内存中相互跟随。所以必须有一种方法可以做这样的事情:

***(g_pppwcSymbol + x) = value;

但是我不确定这是如何工作的。有人可以详细说明吗?


编辑:

到目前为止这似乎有效:

int main(int argc, TCHAR **argv) 
 {
     /*(* (*( (*(g_pppwcSymbol+1) )+2 ) + 3)) = L'K';*/
     /*std::wcout<<g_pppwcSymbol[1][2][3];*/
     ***(g_pppwcSymbol + 1) = L'K';
     std::wcout<<g_pppwcSymbol[1][0][0];
     std::wcin.get();
     return 0;
 }

输出:K


下一步编辑:

工作模式:

static const int X = 2;
static const int Y = 3;
static const int Z = 4;
wchar_t g_pppwcSymbol[X][Y][Z];

int main(int argc, TCHAR **argv) 
 {
     int iAccess = ((Y*Z) * 1) + ((Z) * 2) + 3;
     *( (**g_pppwcSymbol) +  iAccess) = L'K';
     std::wcout<<g_pppwcSymbol[1][2][3];
     std::wcin.get();
     return 0;
 }

输出:K

最佳答案

编译器实际上将 [] 运算符转换为那些数学计算,因此您将以困难的方式进行此操作...但这是一个有趣的练习,所以我会一起玩。


g_pppwcSymbol[2][3][4] 实际上是一个 2 元素大数组,3 元素大数组,4 元素大数组。因此,

g_pppwcSymbol + ((3 * 4) /* size of first level array element */ * 1) + (4 /* size of second level array element */ * 2) + 1 /* size of third level array element */ * 3;

应该给你最后一个数组的最后一个数组的最后一项的位置。只要每个元素都是 1 个字节大。

数组只是一个内存区域,大小为“element_count * element_size[] 运算符将数组位置作为指针并添加 element_size * index。它可能包含其他数组,因为它可以像其他内存结构一样计算它们的大小。

顺便说一句,我相信您会在整个互联网上找到大量关于此的详细文档。

关于c++ - 如何在没有 [] 运算符的情况下正确取消引用多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7590675/

相关文章:

c - 当 p 声明为 int (*)[size] 并分配给数组时,*p 是什么

c++ - 我的 RichEdit 控件可以包含可点击的链接吗?

c++ - std::multimap 和 std::vector 之间的交叉?

c++ - 调用 QSslSocket::startServerEncryption,但没有任何反应

c++ - 可视化多维数组如何放置在内存中的方法?

Java - 二维数组 map 中的移动和墙壁碰撞

c++ - 可以向任何方向延伸的对象的二维网格 C++

arrays - 你如何在 Matlab 中制作二维数组?

c - 使用类型定义的数据类型取消引用通用指针

c - 在堆栈上查找函数的根