C++ 指向多维静态分配数组部分的指针的语法
好的,我有一个多维数组,它是静态分配的。我非常希望得到一个指向它的一部分的指针,并使用该指针访问它的其余部分。基本上,我希望能够做到这样:C++ 指向多维静态分配数组部分的指针的语法,c++,c,arrays,pointers,C++,C,Arrays,Pointers,好的,我有一个多维数组,它是静态分配的。我非常希望得到一个指向它的一部分的指针,并使用该指针访问它的其余部分。基本上,我希望能够做到这样: #include <stdio.h> #include <string.h> #define DIM1 4 #define DIM2 4 #define DIM3 8 #define DIM4 64 static char theArray[DIM1][DIM2][DIM3][DIM4] = {0}; int main() {
#include <stdio.h>
#include <string.h>
#define DIM1 4
#define DIM2 4
#define DIM3 8
#define DIM4 64
static char theArray[DIM1][DIM2][DIM3][DIM4] = {0};
int main()
{
strcpy(theArray[0][0][0], "hello world");
char** ptr = theArray[0][0];
printf("%s\n", ptr[0]);
return 0;
}s
char**
显然不是此处使用的正确类型。我假设这是因为静态分配的数组在内存中作为单个块创建,而动态分配的数组在内存中是分开的,每个维度都有一个指向下一个维度的指针
但是,正如您可能注意到的,这里的维数非常大,我显然需要使用实际变量来索引数组,而不是使用漂亮、纤细的字符0,因此在实际代码中索引数组会非常长。我非常希望有一个指向数组的指针可以使用,这样访问数组就不会那么痛苦了。但是我不能找出正确的语法——如果有。因此,任何帮助都将不胜感激。谢谢。
数组[0][0]
去掉了前两个维度,因此您有了char[DIM3][DIM4]
类型的东西。当数组衰减为指针时,第一个维度将退出,因此您需要的声明是:
char (*ptr)[DIM4] = theArray[0][0];
值得一提的是,gcc还为数组声明显示了一条警告:“警告:初始化器周围缺少大括号”。静态变量和全局变量将自动初始化为0,因此您可以通过删除初始值设定项来修复警告:
static char theArray[DIM1][DIM2][DIM3][DIM4];
不管它是静态的,你的类型不匹配 为什么双指针不能用作二维数组? 这是一个很好的例子,尽管编译器可能不会抱怨, 声明“int**mat”然后将“mat”用作二维数组是错误的。 这是两种非常不同的数据类型,您可以使用它们来访问 内存中的不同位置。在良好的机器(如VAX/VMS)上 错误中止程序,并出现“内存访问冲突”错误 这种错误很常见,因为很容易忘记 约定不得递归(多次)应用于 相同的数组,因此2D数组不等同于双指针 “指向T的指针”不能用作“T的2D数组”。 2D数组“相当于”一个“指向T行的指针”,这 与“指向T的指针”有很大不同 当双指针指向数组的第一个元素时, 与下标符号“ptr[0][0]”一起使用,完全取消引用 两次(见规则5)。两次完全取消引用后,结果为 对象的地址将等于在其中找到的任何值 数组的第一个元素。因为第一个元素包含 我们的数据,我们会有大量的内存访问。 等等。。。。 给出声明
T arr[J][K][L][M];
以下各项均适用:
Expression Type Decays to
---------- ---- ---------
arr T [J][K][L][M] T (*)[K][L][M]
&arr T (*)[J][K][L][M]
arr[j] T [K][L][M] T (*)[L][M]
&arr[j] T (*)[K][L][M]
arr[j][k] T [L][M] T (*)[M];
&arr[j][k] T (*)[L][M]
arr[j][k][l] T [M] T *
&arr[j][k][l] T (*)[M]
表达式类型衰减为
---------- ---- ---------
arr T[J][K][L][M]T(*)[K][L][M]
&arr T(*)[J][K][L][M]
arr[j]T[K][L][M]T(*)[L][M]
&arr[j]T(*)[K][L][M]
arr[j][k]T[L][M]T(*)[M];
&arr[j][k]T(*)[L][M]
arr[j][k][l]T[M]T*
&arr[j][k][l]T(*)[M]
因此,在您的情况下,
ptr
的类型需要是char(*)[DIM4]
如果您使用的是Visual Studio,那么找到表达式类型的一个好方法就是使用typeid
cout与其说是“全局范围内的变量”,不如说是“具有静态存储持续时间的变量”(其中“全局范围内的变量”是其中的一个子集)。很好的一点,更新的答案,尽管试图避免标准ese。
Expression Type Decays to
---------- ---- ---------
arr T [J][K][L][M] T (*)[K][L][M]
&arr T (*)[J][K][L][M]
arr[j] T [K][L][M] T (*)[L][M]
&arr[j] T (*)[K][L][M]
arr[j][k] T [L][M] T (*)[M];
&arr[j][k] T (*)[L][M]
arr[j][k][l] T [M] T *
&arr[j][k][l] T (*)[M]
cout << typeid(&theArray[0][0]).name();