Разница между объявлением указателя с размером и без - PullRequest
0 голосов
/ 09 июня 2019

Я как-то запутался между этими двумя объявлениями

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

Насколько я понимаю, обаиз них дают нам единственный указатель, указывающий на ничто в памяти.Второй показан в качестве примера указателя, указывающего на массив из 3-х дюймов в памяти.Но поскольку эта память даже не выделена, имеет ли это смысл.

Чтобы указатель указывал на массив из 3-х элементов в памяти, нам нужно сделать a = (int*)malloc(sizeof(int) * 3).Делая это для первого И второго, я получу указатель, указывающий на область памяти, где 12 последовательных байтов хранят мои 3 числа.

Так зачем вообще использовать int (*a)[3], если в конце концов мне придется использоватьmalloc?

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

Так зачем вообще использовать int (* a) [3], если в конце концов мне придется использовать malloc?

Это очень полезно для массивов переменной длины, когда вы хотите создать массив 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 размеры .

0 голосов
/ 09 июня 2019

Так зачем вообще использовать int (* a) [3], если в конце концов мне придется использовать malloc?

Поскольку в большинстве таких случаев (динамические двумерные матрицы) у вас должен быть какой-то абстрактный тип данных, использующий гибкие элементы массива . Этот ответ очень актуален для вашего вопроса (который почти дублирует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...