在C中的给定练习中,应有一个函数应返回(一对)成对的int变量对{{x1,y1],[x2,y2],....}。
原型看起来像这样:
void foo( int ***out )
参数格式是什么意思?函数是接收指向out数组的指针,还是必须自己为数组分配内存?
基于描述,最可能的解释是,您正在传递指向int **
对象的指针,而foo
为该对象分配内存,因此您将拥有
void foo( int ***out )
{
*out = ...; // omitting actual allocation here since it's homework,
// but I can guarantee it won't be a single statement
}
int main( void )
{
int **pairs;
...
foo( &pairs );
...
}
注意T **
的对象是不是二维数组;它可以用来实现可以像2D数组一样被索引的内容,但是“行”不必是连续的,甚至不必是相同的长度。它基本上看起来像这样:
pairs pairs[i] pairs[i][0], pairs[i][1]
int ** int * int
+---+ +---+ +---+---+
| +-+-----> | +-+---------> | | |
+---+ +---+ +---+---+
| +-+------+
+---+ | +---+---+
| +-+---+ +--> | | |
+---+ | +---+---+
... |
| +---+---+
+-----> | | |
+---+---+
IOW,您有一个对象pairs
指向一个序列int *
,每个对象[pairs[i]
)都指向一个序列int
。由于[]
下标运算符的工作方式,您可以使用2D数组表示法(pairs[i][j]
)索引到此结构中,但否则它看起来或不会像2D数组那样工作。
因此,我假设foo
的工作是为这样的结构分配内存,其中每个pairs[i]
指向2 int
的序列。由于它需要向pairs
中写入新值,因此我们需要将pointer传递给pairs
。由于pairs
的类型为int **
,因此表达式&pairs
的类型为int ***
。
我可以告诉您,这将是一个多步骤的过程-您需要多次调用malloc
或calloc
。上面的图表应该为您提供一些提示。