Ммм ... возможно я не очень хорошо понимаю ваш вопрос, но в C вы можете передать «по ссылке», передав другой уровень косвенности указателя. То есть указатель на сам двойной указатель bmparray:
unsigned int ** initialize_BMP_array(int height, int width, unsigned int *** bmparray)
{
/* Note the first asterisk */
*bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *));
...
the rest is the same but with a level of indirection
return *bmparray;
}
Таким образом, память для bmparray зарезервирована внутри функции (а затем передана по ссылке).
Надеюсь, это поможет.