所以,我想出了如何取消引用这样的多维数组:
#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/