A useful definition to have, when working with arbitrary-length arrays:
#define countof(a) ( sizeof(a) / sizeof(*(a)) )
A fixed width, arbitrary-length array of bytes:
byte rfids[][10] =
{
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
};
byte* p = rfids[3]; // pointer to rfid at index #3
A fixed width, fixed-length array of bytes is similar, just give the number of rows. The compiler will complain if you don't match the number of rows expected and the actual rows given:
byte rfids[4][10] =
{
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A },
};
byte* p = rfids[3]; // pointer to rfid at index #3
If you really want them as char strings, terminated with zeros (easy for use with Serial.print() for example):
// takes 11 bytes per string due to '\0' terminators
// plus a separate index table of one pointer per string
char* rfids[] =
{
"123456789A",
"123456789A",
"123456789A",
"123456789A",
};
char* p = rfids[3]; // pointer to rfid at index #3
To put them into the EEPROM attic, I would make small custom functions that read or wrote an RFID array or string. Then I could refer to EEPROM RFID #3 and retrieve it into a RAM string for use.