CrossWorks offers unaligned pointers, an extension to the ISO standard that enables 16-bit, 32-bit and 64-bit pointers to be used on byte aligned code and data memory.

Syntax

An unaligned pointer is declared by placing the keyword __unaligned before the pointer declaration:

__unaligned unsigned short *sptr;

this can now be used with byte addresses for example

  char x[10];
  ...
  sptr = (__unaligned unsigned short *)(x+1);
  *sptr = 0x1234;

will assign x[1] to 0x34 and x[2] to 0x12. If you are using Packed structures then you must use __unaligned pointers when taking the address of a member for example

  typedef __packed struct {
    char c;
    short s;
  } packed_structure_t;
  ...
  packed_structure_t ps;
  __unaligned short *sptr = (__unaligned short *)ps.s;

You can declare an unaligned pointer to code memory as follows

  const __code short carr[3];
  ...
  const __unaligned __code short *csptr = (const __unaligned __code short *)carr+1;