指向char[2][2]数组的10指针数组

指向char[2][2]数组的10指针数组,c,arrays,pointers,C,Arrays,Pointers,对于指向[2][2]char数组的指针,我可以写:char(*p)[2][2]和 对于指向char的指针类型的10个元素的数组:char*p[10] 如何编写指针类型为char[2][2]的10个元素的数组 为什么这个语句有语法错误 char (*)[2][2] p[10]; 你需要使用 char (*p[10])[2][2]; 但是您应该真正使用typedef,因为这些decl。可能变得非常复杂: typedef char (*ptr_arr)[2][2]; // our pointer-

对于指向
[2][2]
char数组的指针,我可以写:
char(*p)[2][2]
和 对于指向char的指针类型的10个元素的数组:
char*p[10]

如何编写指针类型为
char[2][2]
的10个元素的数组

为什么这个语句有语法错误

char (*)[2][2] p[10];
你需要使用

char (*p[10])[2][2];
但是您应该真正使用
typedef
,因为这些decl。可能变得非常复杂:

typedef char (*ptr_arr)[2][2]; // our pointer-to-char[2][2]
ptr_arr p[10]; // now we have a clean syntax, this is an array of pointers to char[2][2]
您还可以在C++11中使用新的
,如

using ptr_arr = char(*)[2][2];
ptr_arr p[10];

您应该只使用
typedef

typedef char array[2][2];
typedef array *ptr_to_array[10];

ptr_to_array x; // an array of 10 elements of type pointer to char[2][2]
这样,您就不会让所有未来的代码读者感到困惑,让他们盯着代码看几分钟

或者,使用C++11:

using ptr_to_array = std::array<
                         std::array<std::array<char, 2>, 2>*,
                         10>;
使用ptr_to_array=std::array<
std::数组*,
10>;

如果不要求在相邻内存中分配项,那么一个合理的选择是将所有形式的复杂类型声明放入结构中:

typedef struct
{
  char array[2][2];
} my_type;

my_type* ptr_array[10];
这样做的优点是不会将指针隐藏在typedef后面,这在某些情况下是值得怀疑的做法。特别是在混合指针和数组时,因为在表达式中使用数组时,数组将衰减为指向第一个元素的指针


(如果项目必须相邻分配,那么您仍然可以使用此方法,但您需要使用一些非标准机制(如
#pragma pack(1)
)来消除结构填充)

为什么不使用
std::vector
。抱歉,伙计们,我的坏消息speaking@Cheersandhth.-如果通常最好使用
std::
容器,特别是对于简单的任务,使用普通数组(甚至更糟糕的是:指针)可能会很痛苦。但并非总是如此,并非无处不在<代码>矢量< /代码>不是解决所有问题的方法。我用C交叉编译器编写一个游戏(TeRIOS),用C交叉编译器不支持类。@ MasoudFARD,然后你应该把你的问题标记为C,而不是C++。关于数组衰变,你将得到:“啊,是的,这是指向2x2数组的十个数组指针数组的第一个元素的指针。琐碎的。”:)