将指针转换为指向数组的指针

5
以下是代码片段。我想知道在c语言中,第17行的类型转换是否有效和正确?
#include <stdio.h>

typedef int twoInts[2];

void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);

int main () {
    twoInts a;
    a[0] = 0;
    a[1] = 1;
    print(&a);
    intermediate(a);
    return 0;
}
void intermediate(twoInts b) {
    print((int(*)[])b); // <<< line no. 17 <<<
}

void print(twoInts *c){
    printf("%d\n%d\n", (*c)[0], (*c)[1]);
}

此外,当我将定义 intermediate 更改为
void intermediate(twoInts b) {
    print(&b);
}

编译时我收到以下警告,输出结果不正确。

1.c:17:11: warning: passing argument 1 of print from incompatible pointer type
     print(&b);
           ^
1.c:5:6: note: expected int (*)[2] but argument is of type int **
 void print(twoInts *twoIntsPtr);

据我理解,数组在函数参数中会退化为指向int的指针。这是什么原因?

3
让我补充一下:void print(twoInts *twoIntsPtr);void print(int (*twoIntsPtr)[2]); 是相同的,换句话说,不要在typedef后面隐藏数组和指针。 - this
2
问题的最佳和适当解决方案,确实是永远不要在typedef后面隐藏数组。然后,您可以使用普通的int *指针,而无需使程序变得模糊不清。 - Lundin
我会说 print((twoInts *)&b); 应该可以。 - alk
1个回答

3

a是一个数组。所以当你将它传递给intermediate()时,它会被转换为指向其第一个元素的指针(也称为“数组衰减”)。

因此,在以下代码中的b

void intermediate(twoInts b) {
    print(&b);
}

类型为int*,而不是你可能期望的int[2]。因此,&b的类型是int**,而不是print()函数期望的int (*)[2]类型。因此,类型不匹配。

如果你将intermediate()更改为:

void intermediate(twoInts *b) {
    print(b);
}

那么您就不需要传递&b的地址,它会按预期工作且类型匹配正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接