【问题标题】:Two dimension arrays and pointer representation二维数组和指针表示
【发布时间】:2018-09-06 06:35:13
【问题描述】:

1 中的三个问题。

  1. 如果我有一个二维数组 -

    int array_name[num_rows][num_columns] 
    

    所以它由 num_rows 数组组成 - 每个数组都是大小 = num_columns 的数组。它使用指针数组的等效表示是 -

    int* array_name[num_rows] 
    

    -所以 [num_rows] 给出的索引仍然显示一维数组的数量 - 在某处使用 malloc 我们可以将每个一维数组的大小指定为 num_columns。那正确吗?我看到一些文字告诉

    int* array_name[num_columns] 
    

    在这种情况下索引不会切换吗?

  2. 对于 ID 数组,我会动态指定大小 -

    int *p;
    p = (int*) malloc (size * sizeof(int))
    

    对于二维数组,我是指定整个二维数组的大小还是在 malloc 中指定一个一维数组的大小 -

    int*p [row_count];
    p = (int*) malloc (row_count * column_count * sizeof(int))
    

    p = (int*) malloc (column_count * sizeof(int))
    

    我认为应该是第二个,因为 p 是指向一维数组的指针,而 p+1 是指向一维数组的指针等。请澄清。

  3. 对于问题 2 - 如果 p 被定义为 - int **p; 而不是 int * p[row_count] 那么 malloc 将如何使用呢?我觉得应该是——

    p = (int*) malloc (row_count * column_count * sizeof(int))
    

请更正、确认、改进。

【问题讨论】:

标签: c arrays pointers multidimensional-array


【解决方案1】:

声明:

int *array_name[num_rows];

或:

int *array_name[num_columns];

是一样的。只有名称发生了变化,但您的变量仍然引用行,因为 C 是 row major,因此您应该将其命名为行。

这里是如何分配一个二维数组:

int (*p)[column] = malloc (sizeof(int[row][column]);

可以分配一个 int ** 而 int [][] 是一个临时数组,仅在您的函数范围内定义。

不要忘记几乎每一行的末尾都需要一个分号。
您应该阅读this page 以获得对该主题的更完整解释

【讨论】:

  • 不,要分配 2D 数组,您将使用 指针 而不是数组来分配它。在您的示例中,p 已经是一个分配的数组。要动态分配它,请使用int (*p)[column] = malloc (sizeof(int[row][column]);。或者,您可以使用int** p 制作查找表,但在这种情况下这是不好的做法。见Correctly allocating multi-dimensional arrays
  • @Lundin 我知道我哪里错了,并相信我已经做出了必要的更正,因此不应该传播误解,感谢您指出错误。请告诉我我现在是否正确。
【解决方案2】:
  1. (和 2.)

    如果我有一个二维数组

    int array_name[num_rows][num_columns];

    所以它由 num_rows 数组组成 - 每个数组都是 size = num_columns 的数组。

如果num_rowsnum_columns 在编译时已知,则该行声明num_rows 数组num_columnsints 的数组,是的,通常称为@ 的二维数组987654332@.

从 C99(以及 C11 中的可选)开始,您可以在编译时使用两个未知变量,并最终声明一个可变长度数组。

它使用指针数组的等效表示是

int* array_name[num_rows];

所以 [num_rows] 给出的索引仍然显示一维数组的数量 - 在某个地方使用 malloc 我们可以将每个一维数组的大小指定为 num_columns。对吗?

从技术上讲,现在 array_name 被声明为 array of num_rows pointersint,而不是数组。要“完成”“二维数组”,应该遍历数组并为每一行分配内存。请注意,行可能有不同的大小。

使用这种形式:

int (*array_name)[num_columns];
//  ^           ^ note the parenthesis 
array_name = malloc(num_rows * sizeof *array_name);

这里,array_name 被声明为一个指向num_columnsints 的数组的指针,然后分配所需的行数。

3.

如果 p 被定义为 int **p;

其他答案显示了在这种情况下如何分配内存,但虽然它被广泛使用,但它并不总是最好的解决方案。参见例如:

Correctly allocating multi-dimensional arrays

【讨论】:

猜你喜欢
  • 2019-09-09
  • 1970-01-01
  • 2021-12-17
  • 2018-04-18
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多