声明有大小指针和无大小指针的区别

时间:2019-06-09 07:39:47

标签: c pointers malloc

我对这两个声明感到困惑

  1. int *a;
  2. int (*a)[3]

据我了解,这两个都为我们提供了一个指向内存中没有内容的指针。第二个示例显示为指向内存中3个int数组的指针的示例。但是由于尚未分配该内存,因此没有任何意义。

要使指针指向内存中3个整数的数组,我们需要执行a = (int*)malloc(sizeof(int) * 3)。在第一个和第二个中都这样做,这两者都会给我一个指向存储位置的指针,该存储位置中12个连续字节存储了我的3个数字。

那么,如果最终不得不使用malloc,为什么还要使用int (*a)[3]呢?

2 个答案:

答案 0 :(得分:4)

  

那么,如果最终不得不使用malloc,为什么还要使用int(* a)[3]?

当您要使用动态内存创建 real 2d数组时,它对于可变长度数组非常有用:

#include <stdio.h>
#include <stdlib.h>

void *fn_alloc(int rows, int cols)
{
    int (*arr)[cols];
    int i, j;

    arr = malloc(sizeof(int [rows][cols]));
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            arr[i][j] = (i * cols) + j;
        }
    }
    return arr;
}

void fn_print(int rows, int cols, int (*arr)[cols])
{
    int i, j;

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            printf("\t%d", arr[i][j]);
        }
        printf("\n");
    }
}

int main(void)
{
    int rows, cols;

    scanf("%d %d", &rows, &cols);

    int (*arr)[cols] = fn_alloc(rows, cols);
    fn_print(rows, cols, arr);
    free(arr);
    return 0;
}

换句话说,当涉及到动态内存时,您的第一个声明对于指向n维的数组很有用,而第二个声明则指向n维的数组n个维度

答案 1 :(得分:0)

  

那么,如果最终不得不使用malloc,为什么还要使用int(* a)[3]?

由于在大多数情况下(动态调整大小的2D矩阵),您应该使用flexible array members来获取一些抽象数据类型。 This answer与您的问题非常相关(几乎重复)。