指向数组的指针

问题描述 投票:1回答:4

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

c++ arrays pointers
4个回答
4
投票

我可以(不)看到这只用于这种方式:

int (*a)[4] = new int[6][4];
int (**ff)[4] = &a;

int (**ff)[4]的意思是“指向指向四个ints数组的指针”。这意味着我们必须首先使用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。不要忘记你现在拥有的是一个动态分配的未初始化指针。


0
投票

双指针是一个指向指针的指针,可以显而易见。这意味着它将保持指针的内存地址,再次显而易见。这意味着你初始化你的指针,然后指向它的双指针。如,

int* f[] = new int[4];
int** ff = &f;

然后你可以这样做,

(*ff)[1]

这将允许您访问存储在动态数组中的信息。

注意:如果在编译时未知大小,则将[]旁边的[]留空,这就是你应该首先这样做的原因。


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
投票

艾伦,

我认为这里的问题是你最初的假设是不正确的。 * f [4](或(* f)[4])实际上是一个包含4个int指针的数组,而不是指向4个int数组的指针。然后,** ff [4]将指向指向int的4个指针的数组。我会建议稍微备份一下,掌握这些信息,然后重新尝试。此外,对** ff的赋值将是单个指针,可能不是数组,具体取决于您打算如何使用它。

                            Blake Mitchell
                            retired free lance programmer
© www.soinside.com 2019 - 2024. All rights reserved.