gpt4 book ai didi

c - 需要写一个cast操作符

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:28 25 4
gpt4 key购买 nike

该函数需要一个指向二维数组[4][5] 的指针。事实上,我们可以提交一个指向一维数组的指针 [20]。即源代码如下所示:

extern f (int a[4][5]);
int b[20];
void func (void)
{
f (b);
}

即它是完美的工作代码(前提是数组b 的内部,我们将像在二维数组中一样进行布局)。但是编译会发出警告(由于类型不足):

$ gcc t.c -c
t.c: In function 'func':
t.c:7: warning: passing argument 1 of 'f' from incompatible pointer type

需要写一个强制转换运算符来警告消失

最佳答案

extern f (int a[4][5]);

用数组类型定义的参数会在编译时调整,因此它实际上是指针类型,特别是指向数组元素类型的指针。在这种情况下,int a[4][5] 是一个包含 4 个元素的数组,每个元素都是一个包含 5 个 int 元素的数组。调整后的实际类型是指向5个int数组的指针,所以上面正好等价于:

extern f(int (*a)[5]);

请注意,4 会被静默忽略。 (委婉地说,这不是我最喜欢的 C 语言特性。)

现在声明一个包含 20 个 int 的数组:

int b[20];

并尝试将其传递给 f:

void func (void)
{
f (b);
}

由于 b 是数组类型的表达式,它(在大多数但不是所有上下文中)隐式转换为指向数组第一个元素的指针。 (异常(exception)情况是数组表达式是 sizeof 的操作数、一元 &,或者当它是用于初始化数组的字符串文字时,这些都不适用于此处)。所以这个电话:

f(b);

相当于:

f(&b[0]);

参数是 int* 类型,与预期类型 int(*)[5] 不兼容。

如果f 的参数类型是固定的,那么您需要向它传递一个指向数组的指针。例如,您可以更改 b 的定义,使其与 f 的预期兼容。

我可能会这样写:

extern f (int (*a)[5]);

int b[4][5];

void func (void)
{
f(b);
}

我更改了 f 的声明,以便它更清楚地指示参数的实际类型,并且我将 b 重新定义为二维数组。 b 仍然包含 20 个 int 元素,但它是不同的类型。

请记住,这里有两个不同的数组/指针语言规则在起作用。一个是数组类型的参数被调整(在编译时),所以它真的是指针类型。另一个是数组类型的表达式,在大多数(但不是所有)上下文中,隐式转换为指向数组第一个元素的指针。

这两条规则共同作用使新手 C 程序员对数组和指针之间的关系感到困惑。

另请参阅 comp.lang.c FAQ 的第 6 节.

关于c - 需要写一个cast操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com