Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向多维静态分配数组部分的指针的语法_C++_C_Arrays_Pointers - Fatal编程技术网

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();