我有一个变量定义int (**ff)[4];
,看起来很糟糕。如果我是正确的(从int (*f)[4];
是指向4个int-s数组的指针的事实推断),这是一个指向4个int-s数组的指针。
现在我试图初始化这个东西,但我没有成功。初始化f
很简单(f = new int[5][4];
),但线ff = new int*[6][4];
不起作用。 Microsoft Visual Studio社区2013在一条错误消息中说
a value of type "int *(*)[4]" cannot be assigned to an entity of type "int (**)[4]"
我有一种非常糟糕的感觉,我真的误解了一些东西。
编辑:
对不起,我没有明确地说过:我想要的是,不仅为一个分配内存空间,而且为更多的指针分配,后来可以指向4个int-s数组的数组。当然,我想在一行中没有任何其他定义,转换等的帮助。
我可以(不)看到这只用于这种方式:
int (*a)[4] = new int[6][4];
int (**ff)[4] = &a;
int (**ff)[4]
的意思是“指向指向四个int
s数组的指针”。这意味着我们必须首先使用int (*)[4]
- 一个左值,所以我们可以用operator&
获取它的地址。
另一方面,new int*[6][4];
分配一个指向四个指针数组的指针数组(“外部”数组衰减)。这与第一种完全不同。
我不得不在这个问题上帮助自己加入cdecl.org。
编辑:
我刚刚做了这个:
using PTR = int (*)[4];
int (**ff)[4] = new PTR; // hooray, a dynamically allocated pointer!
但没有类型别名就无法找到方法......
实际上,有一个:int (**ff)[4] = new (int (*)[4])
,来自this Q&A。不要忘记你现在拥有的是一个动态分配的未初始化指针。
双指针是一个指向指针的指针,可以显而易见。这意味着它将保持指针的内存地址,再次显而易见。这意味着你初始化你的指针,然后指向它的双指针。如,
int* f[] = new int[4];
int** ff = &f;
然后你可以这样做,
(*ff)[1]
这将允许您访问存储在动态数组中的信息。
注意:如果在编译时未知大小,则将[]旁边的[]留空,这就是你应该首先这样做的原因。
如果你想通过指向数组的指针来访问数组a [3] [3]的元素,那么你可以通过下面的代码来访问它们:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*p)[3]=a;
int (**ff)[3]=&p;
要打印它:
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",ff[0][i][j]);
}
printf("\n");
}
艾伦,
我认为这里的问题是你最初的假设是不正确的。 * f [4](或(* f)[4])实际上是一个包含4个int指针的数组,而不是指向4个int数组的指针。然后,** ff [4]将指向指向int的4个指针的数组。我会建议稍微备份一下,掌握这些信息,然后重新尝试。此外,对** ff的赋值将是单个指针,可能不是数组,具体取决于您打算如何使用它。
Blake Mitchell
retired free lance programmer