This code has Undefined Behavior whether or not you use b. Why? Because a[3] is equivalent to *(a+3) by definition. And here's a quote from the standard that proved that *(a+3) is in itself undefined, regardless of whether the value is stored, used, or left alone.
When an expression that has integral
  type is added to or subtracted from a
  pointer, the result has the type of
  the pointer operand. If the pointer
  operand points to an element of an
  array object, and the array is large
  enough, the result points to an
  element offset from the original
  element such that the difference of
  the subscripts of the resulting and
  original array elements equals the
  integral expression. In other words,
  if the expression P points to the i-th
  element of an array object, the
  expressions (P)+N (equivalently,
  N+(P)) and (P)-N (where N has the
  value n) point to, respectively, the
  i+n-th and i−n-th elements of the
  array object, provided they exist.
  Moreover, if the expression P points
  to the last element of an array
  object, the expression (P)+1 points
  one past the last element of the array
  object, and if the expression Q points
  one past the last element of an array
  object, the expression (Q)-1 points to
  the last element of the array object.
  If both the pointer operand and the
  result point to elements of the same
  array object, or one past the last
  element of the array object, the
  evaluation shall not produce an
  overflow; otherwise, the behavior is
  undefined.