#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 Итак… Это лучше? 🙂