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]
在这种情况下不会切换索引吗?
对于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是指向一维数组的指针,等等。请说明。
对于问题2-如果p定义为-
int **p;
而不是
int * p[row_count]
那么如何使用malloc?我认为应该-
p = (int*) malloc (row_count * column_count * sizeof(int))
请更正,确认和改进。
答案 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)
如果我有一个二维数组
int array_name[num_rows][num_columns];
所以它由num_rows个数组组成-每个数组都是一个大小为num_columns的数组。
如果在编译时同时知道num_rows
和num_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
其他答案显示了在这种情况下如何分配内存,但是尽管它被广泛使用,但它并不总是最佳的解决方案。参见例如: