The task at hand is interlacing nibbles, more specifically 'un-serialisation' of data.
To help you see it more explicitly:
#define n2uc(high_nibble, low_nibble) (((high_nibble) & 0xf0) | ((low_nibble) & 0x0f))
...
uc_ptr = (unsigned char *) &address;
*uc_ptr++ = n2uc(d, e);
*uc_ptr++ = n2uc(b, c);
*uc_ptr = n2uc(0, a);
//done
You can find out which is faster.