if irCommand[ne] = irCmd; does not make a copy of the data then how come it works in my catSat example?
Is that snippet from your catSat example? If so, the compiler creates space for each literal. The pointer then points to that space. The space for each literal is different, so the pointers all point to different spaces.
I want to have one array contain the IR code (C0E8) and another array to have the IR command (PWR), so I can lookup the IR code to give an human understandable response.
You can do that. An array of pointers is not necessary, though.
Declare an array that can hold 5 characters per value by 33 values:
char IRCodes[5][33];
Make sure that the n characters per value is enough to contain the trailing NULL, too.