我有一个变量定义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数组的数组。当然,我想在一行中没有任何其他定义,转换等的帮助。
答案 0 :(得分:4)
我可以(不)看到这只用于这种方式:
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。别忘了你现在拥有的只是一个动态分配的未初始化指针。
答案 1 :(得分:0)
双指针是一个指向指针的指针,可以显而易见。这意味着它将保持指针的内存地址,再次显而易见。这意味着你初始化你的指针,然后指向它的双指针。如,
int* f[] = new int[4];
int** ff = &f;
然后要访问它,你可以这样做,
(*ff)[1]
这将允许您访问存储在动态数组中的信息。
注意:如果在编译时不知道大小,请将[]旁边的[]留空,这就是你应该首先这样做的原因。
答案 2 :(得分:0)
如果要通过指向数组指针的指针来访问数组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");
}
答案 3 :(得分:-3)
艾伦,
我认为这里的问题是你的初步假设不正确。 * f [4](或(* f)[4]) 实际上是一个4指针到int的数组,而不是指向一个指针 4个整数的数组。然后, ** FF [4] 将是一个指向4个指针数组的指针 INT。我会建议稍微备份一下,掌握这些信息,并且 再试一次。另外,分配给 ** FF 将是一个单指针,和 可能不是一个数组,取决于你打算如何使用它。
Blake Mitchell
retired free lance programmer