(int (*)[])var1代表什么?

8

我找到了这个代码示例,然后尝试谷歌一下(int (*)[])var1是什么意思,但是没有找到有用的结果。

#include <unistd.h>
#include <stdlib.h>

int i(int n,int m,int var1[n][m]) {
    return var1[0][0];
}

int example() {
    int *var1 = malloc(100);
    return i(10,10,(int (*)[])var1);
} 

通常我在C99中使用可变长度数组,因此我习惯于:

#include <unistd.h>
#include <stdlib.h>

int i(int n,int m,int var1[n][m]) {
    return var1[0][0];
}

int example() {
    int var1[10][10];
    return i(10,10,var1);
} 

谢谢!

3个回答

11

我本来要建议使用cdecl工具,很高兴看到它有一个Web前端 :) - crazyscot
1
我很困惑 - 没有"int数组"这种类型。数组类型必须有一个大小,即使它是可变的。这个类型在转换中真的有效吗?如果有效,它是什么意思?sizeof *(int (*)[])0是什么意思? - R.. GitHub STOP HELPING ICE
根据comp.lang.c faq,@R..说:“如果数组的大小未知,原则上可以省略N,但是产生的类型'指向未知大小数组的指针'是无用的。” 在gcc上行为是不完整的类型错误。 - Michael Lowman

1

这是将类型转换为指向 int 数组的指针。


0

(int (*)[]) 是指向 int 数组的指针。相当于 int[n][m] 函数参数。

这是 C 语言中常见的习惯用法:首先使用 malloc 来保留内存,然后将其转换为所需类型。


我认为你应该重新表达你的答案,因为 int[][] 不是有效的 C 语法,而且你的意思仍然不清楚。 - Jens
为什么要将malloc的返回值强制转换呢?它是一个指向void的指针,在C语言中可以直接赋值给任何指针类型而不需要强制转换。(在C++中,你根本不会使用malloc,而是使用new)。 - Jens
@Jens:我应该保持沉默:) 我不是C语言大师,所以我只能解释代码的含义,而不能看到它应该读什么。 - xtofl

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