Обработка 2D-массива с помощью указателя на C

#c #arrays #pointers #2d

#c #массивы #указатели #2d

Вопрос:

Допустим, у меня есть функция, которая управляет 2D-массивом, который получает указатель на 2D-массив из функции main в качестве своего параметра.

Теперь я хочу изменить (предположим, добавить 10 к каждому элементу) каждый элемент 2D-массива.

Мне интересно узнать о прохождении по 2D-массиву с помощью одного указателя, данного мне, и вернуть указатель на недавно измененный массив.

Грубая структура

Предположим, что указатель a содержит начальный адрес 2D-массива.

 int add_10(int *a)
{
    int i, j,
        b[M][N] = {0};

    for(i = 0; i < M; i  )
        for(j = 0; j < N; j  )
            b[i][j] = 10   a[i][j];
}
 

Комментарии:

1. Попробуйте выполнить поиск «2d-массив c» в stack overflow. Возможно , вы найдете несколько ответов.

2. Это зависит от того, есть ли у вас указатель на array ( int (*a)[N]) ) или указатель на указатель на int ( int** ) ; вам придется соответствующим образом объявить свою функцию. Однако синтаксис a[i][j] в обоих случаях одинаков.

Ответ №1:

 int* add_10(const int *dest,
            const int *src,
            const int M,
            const int N)
{
    int *idest = dest;

    memmove(dest, src, M * N * sizeof(int));

    for(int i = 0; i < (M * N);   i)
        *idest    = 10;

    return dest;
}
 

Комментарии:

1. Это прерывается, если он использует 2d-массивы или типы указателей на массивы, а не массив массивов.

2. @Dave … *(*(dest i) j) = 10 *(*(source i) j); Лучше? Я бы подумал, что обе версии верны.

3. Нет, вы используете принципиально другой тип. int k[5][5] представляет собой непрерывный блок из 25 целых чисел. Это не массив массивов.

4. Нет функции, которая гарантированно работала бы для обоих; но op спросил о 2d-массивах.

5. @Dave Итак… Это лучше? 🙂