将指针数组从一种类型转换为另一种类型

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

为什么以下程序无法运行?

void test(int*[]);
int main()
{
    char *a[2];
    test((int*[])a);
    
    return 0;
}

void test(int* c[]){

}

它显示

错误转换为不完整类型 'int*[]' test((int*[])a)

问题可以通过使用来解决:

test((int**)a);

但是前面的代码有什么问题吗?

编辑:在函数原型声明中,括号内使用与强制转换相同的内容。

(整数*[])

那么为什么这不是一个不完整的类型呢?

c
1个回答
0
投票

问题是

int *[]
是一个不完整的类型,无法实例化。

在函数声明中,

int *[]
int **
完全相同,因为在任何情况下传递给函数的实际参数都将是“指向 int 指针的指针”。因此,在函数声明的上下文中,
int *[]
实际上指的是完整类型(指向int的指针)。

然而,在转换中,

(int *[])a
告诉编译器创建类型为
int *[]
的临时类型,但这是不允许的,因为它是不完整的类型。

虽然我们不能拥有不完整类型的值,但我们可以拥有指向此类值的指针,因此可以编译以下代码(只是为了示例;这不是推荐的构造) - 使用 typedef 以获得更清晰的表示法:

typedef int * incompleteIntArray[];

void test(int*[]);
int main()
{
    char *a[2];
    test(*(incompleteIntArray *)&a);
}

这里的要点是,虽然

incompleteIntArray
(又名
int *[]
)是不完整类型,但指向该类型的指针却不是。因此,指向
&a
的指针
char *[2]
可以转换为指向
int *[]
的指针,我们可以取消引用它来创建函数参数。但是,这只有效,因为数组始终通过引用传递,因此实际参数是指针,而不是
int *[]
的实例。

© www.soinside.com 2019 - 2024. All rights reserved.