Если вы хотите передать это функции, я бы проголосовал против использования простых массивов. Рассмотрим:
void doWork(Pixel array[][]);
Не содержит информации о размере. Вы можете передать информацию о размере через отдельные аргументы, но я бы предпочел использовать что-то вроде std :: vector . Конечно, для этого необходимо определить соглашение об адресации (основной ряд или основной столбец).
Альтернативой является std :: vector >, где каждый уровень векторов представляет собой одно измерение массива. Преимущество: двойной индекс, как в pixelArray [x] [y], работает, но создание такой структуры утомительно, копирование обходится дороже, потому что это происходит с отдельным экземпляром вектора, а не с простым memcpy, и векторы, содержащиеся в вектор верхнего уровня не обязательно должен иметь одинаковый размер.
Это в основном ваши варианты использования стандартной библиотеки. Правильным решением будет что-то вроде std :: vector с двумя измерениями. Вспоминаются числовые библиотеки и библиотеки манипулирования изображениями, но матрицы и классы изображений, скорее всего, ограничены примитивными типами данных в своих элементах.
РЕДАКТИРОВАТЬ: Забыл прояснить, что все выше, это только аргументы. В конце концов, ваш личный вкус и контекст должны быть приняты во внимание. Если вы сами в проекте, вектор плюс определенное и задокументированное соглашение об адресации должно быть достаточно хорошим. Но если вы в команде, и, вероятно, кто-то не примет во внимание документированное соглашение, каскадная структура вектор-вектор, вероятно, будет лучше, потому что утомительные части могут быть реализованы вспомогательными функциями.