了解指向整数类型的指针数组的指针

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

在C中的给定练习中,应有一个函数应返回(一对)成对的int变量对{{x1,y1],[x2,y2],....}。

原型看起来像这样:

void foo( int ***out )

参数格式是什么意思?函数是接收指向out数组的指针,还是必须自己为数组分配内存?

c pointers arguments
1个回答
0
投票

基于描述,最可能的解释是,您正在传递指向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 ***

我可以告诉您,这将是一个多步骤的过程-您需要多次调用malloccalloc。上面的图表应该为您提供一些提示。

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