指向数组

时间:2016-02-16 22:46:51

标签: c++ arrays pointers

我有一个变量定义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数组的数组。当然,我想在一行中没有任何其他定义,转换等的帮助。

4 个答案:

答案 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