Hints to the compiler that access to an object should be as fast as possible. Whether the compiler actually uses the hint is implementation-defined; it may simply treat it as equivalent to auto.

The only property that is definitively different for all objects that are declared with register is that they cannot have their address computed. Thereby register can be a good tool to ensure certain optimizations:

register size_t size = 467;

is an object that can never alias because no code can pass its address to another function where it might be changed unexpectedly.

This property also implies that an array

register int array[5];

cannot decay into a pointer to its first element (i.e. array turning into &array[0]). This means that the elements of such an array cannot be accessed and the array itself cannot be passed to a function.

In fact, the only legal usage of an array declared with a register storage class is the sizeof operator; any other operator would require the address of the first element of the array. For that reason, arrays generally should not be declared with the register keyword since it makes them useless for anything other than size computation of the entire array, which can be done just as easily without the register keyword.

The register storage class is more appropriate for variables that are defined inside a block and are accessed with high frequency. For example,

/* prints the sum of the first 5 integers*/
/* code assumed to be part of a function body*/ 
{ 
   register int k, sum;
   for(k = 1, sum = 0; k < 6; sum += k, k++);
       printf("\\t%d\\n",sum);
}

The _Alignof operator is also allowed to be used with register arrays.