C 二维数组与指针表示
1中有三个问题C 二维数组与指针表示,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,1中有三个问题 如果我有一个二维数组- int array_name[num_rows][num_columns] 因此,它由num_行数组组成,每个数组都是size=num_列的数组。其使用指针数组的等效表示形式为- int* array_name[num_rows] -因此,[num_rows]给出的索引仍然显示了一维数组的数量——在使用malloc的某个地方,我们可以将每个一维数组的大小指定为num_列。是这样吗?我看到一些短信告诉我 int* array_name[num_col
int array_name[num_rows][num_columns]
因此,它由num_行数组组成,每个数组都是size=num_列的数组。其使用指针数组的等效表示形式为-
int* array_name[num_rows]
-因此,[num_rows]给出的索引仍然显示了一维数组的数量——在使用malloc的某个地方,我们可以将每个一维数组的大小指定为num_列。是这样吗?我看到一些短信告诉我
int* array_name[num_columns]
在这种情况下,不会切换索引吗int *p;
p = (int*) malloc (size * sizeof(int))
对于二维数组,我是否在malloc中指定整个二维数组或一个一维数组的大小-
int*p [row_count];
p = (int*) malloc (row_count * column_count * sizeof(int))
或
我认为应该是第二个,因为p是指向一维数组的指针,p+1是指向一维数组的指针,请澄清int**p代码>而不是
int*p[行计数]
那么malloc将如何使用呢?我认为应该是——
p = (int*) malloc (row_count * column_count * sizeof(int))
int *array_name[num_rows];
或:
是一样的。只有名称更改,但变量仍然引用行,因为C是一个变量,所以应该将其命名为行
以下是如何分配二维阵列:
int (*p)[column] = malloc (sizeof(int[row][column]);
可以分配int**而int[][]是仅在函数范围内定义的临时数组
不要忘记,几乎每行末尾都需要一个分号。你应该仔细阅读,以便更完整地解释这个问题
int数组_名称[num_行][num_列]代码>
因此,它由num_行数组组成,每个数组都是size=num_列的数组
num\u行
和num\u列
,则该行声明一个num\u行的数组
一个num\u列的数组
int
s,是的,它通常被称为int
的二维数组
由于C99(在C11中也是可选的),您可以在编译时使用两个未知变量,并最终声明一个可变长度数组
其使用指针数组的等效表示形式为
int*数组名称[num\u行]代码>
因此,[num_rows]给出的索引仍然显示了一维数组的数量——在使用malloc的某个地方,我们可以将每个一维数组的大小指定为num_列。是这样吗
从技术上讲,现在array\u name
被声明为一个数组,其中包含num\u行指向int
的指针,而不是数组。要“完成”2D数组,应该遍历数组并为每一行分配内存。请注意,行可以有不同的大小
使用此表格:
int (*array_name)[num_columns];
// ^ ^ note the parenthesis
array_name = malloc(num_rows * sizeof *array_name);
这里,array\u name
被声明为指向num\u列的数组的指针,然后分配所需的行数
三,
如果p被定义为int**p代码>
其他答案显示了在这种情况下如何分配内存,但尽管它被广泛使用,但并不总是最佳解决方案。例如,见:
语言标记和代码格式请参见回答核心问题是这两种形式不等效。可能重复。否,要分配2D数组,您将使用指针而不是数组来分配它。在您的示例中,p
已经是分配的数组。要动态分配它,请使用int(*p)[column]=malloc(sizeof(int[row][column]);
。或者,您可以使用int**p
创建一个查找表,但在这种情况下,这是一种不好的做法。请参阅。@Lundin我知道我错在哪里,并相信已经进行了必要的更正,因此错误概念不应传播。感谢您指出错误。请告诉我现在是否正确。请注意,至少t发布到的大多数向上投票的答案都不能保证有效,因为它们不能保证数据元素的适当对齐。这更好:@AndrewHenle很好,我应该寻找一个更好的答案。不过,我喜欢和的答案。
int (*p)[column] = malloc (sizeof(int[row][column]);
int (*array_name)[num_columns];
// ^ ^ note the parenthesis
array_name = malloc(num_rows * sizeof *array_name);