Serial.println for pointers to the byte datatype behaves unexpectedly
A byte is to small to store a pointer value. Instead to casting to
byte, you should cast to uintptr_t, which is guaranteed to be large
enough. On an AVR-based device like the Uno, this is the same as
uint16_t or unsigned int, but uintptr_t is more general.

Edit: From your comment it would seem you want to print the contents
of the array instead of the addresses of the rows. The obvious way is to
loop with two indices:



for (size_t i = 0; i &lt; 16; i++) for (size_t j = 0; j &lt; 6; j++)
    Serial.println(subkeys[i][j]);


If you really want to use subkeys as a 1D array, then cast it to a
byte *, which is the type a 1D array would naturally decay to:

for (size_t address = 0; address &lt; 16*6; address++)
    Serial.println(((byte *) subkeys)[address]);