C standard says
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.
char *ptr3 = buffer +6;
We can take the address one beyond the end of an array, but you can't dereference it. For your array of 6 items, buffer+6
would work. However &buffer[6]
really causes undefined behavior or not (and if it does, whether it really should). However, the result of that expression is unspecified (just guaranteed not to be an overflow).
char *ptr3 = buffer +7;
While any other expression going more than one past the array bound is explicitly undefined behavior.
Now going beyond one past of array means array out of bound checking .As C does not have array out of bond checking so as C standard is concerned, accessing an array outside its bounds has "undefined behavior".
Now correct me if wrong ?