二维数组和指针表示

时间:2018-09-06 06:35:14

标签: c arrays pointers multidimensional-array

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))
    

    对于2个D数组,我是否在malloc中指定整个2D数组或一个1D数组的大小-

    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))
    

请更正,确认和改进。

2 个答案:

答案 0 :(得分:2)

声明:

int *array_name[num_rows];

或:

int *array_name[num_columns];

是同一回事。只有名称会更改,但是您的变量仍引用行,因为C是row major,因此应将其命名为行。

这里是分配2D数组的方法:

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

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

别忘了几乎每行的末尾都需要使用分号。
您应该阅读this page,以更全面地了解该主题

答案 1 :(得分:1)

  1. (和2.)。
      

    如果我有一个二维数组

         

    int array_name[num_rows][num_columns];

         

    所以它由num_rows个数组组成-每个数组都是一个大小为num_columns的数组。

如果在编译时同时知道num_rowsnum_columns,则该行声明num_rows num_columns s的int数组,这是,通常称为int的2D数组。

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

  

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

     

int* array_name[num_rows];

     

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

从技术上讲,现在array_name被声明为{strong> num_rows的指针 {strong>指针的数组,而不是数组。要“完成”“ 2D数组”,应遍历该数组并为每一行分配内存。请注意,这些行的大小可以不同。

使用此表单:

int

在这里,int (*array_name)[num_columns]; // ^ ^ note the parenthesis array_name = malloc(num_rows * sizeof *array_name); 被声明为指向array_name num_columns s数组的指针,然后分配了所需的行数。

3。

  

如果p被定义为int

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

Correctly allocating multi-dimensional arrays