Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二维数组与指针表示_C_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

C 二维数组与指针表示

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

1中有三个问题

  • 如果我有一个二维数组-

    int array_name[num_rows][num_columns] 
    
    因此,它由num_行数组组成,每个数组都是size=num_列的数组。其使用指针数组的等效表示形式为-

    int* array_name[num_rows] 
    
    -因此,[num_rows]给出的索引仍然显示了一维数组的数量——在使用malloc的某个地方,我们可以将每个一维数组的大小指定为num_列。是这样吗?我看到一些短信告诉我

    int* array_name[num_columns] 
    
    在这种情况下,不会切换索引吗

  • 对于ID数组,我动态指定大小为-

    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是指向一维数组的指针,请澄清

  • 对于问题2-如果p被定义为-
    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[][]是仅在函数范围内定义的临时数组

    不要忘记,几乎每行末尾都需要一个分号。
    你应该仔细阅读,以便更完整地解释这个问题

  • (和2) 如果我有一个二维数组

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