C explicitly defines "array" as a type.
Quoting C11
, chapter §6.2.5, Types (emphasis mine)
An array type describes a contiguously allocated nonempty set of objects with a
particular member object type, called the element type. The element type shall be
complete whenever the array type is specified. Array types are characterized by their
element type and by the number of elements in the array. An array type is said to be
derived from its element type, and if its element type is T, the array type is sometimes
called ‘‘array of T’’. The construction of an array type from an element type is called
‘‘array type derivation’’.
In a nutshell, the answer is, array elements are stored in separate but contiguous locations.
Let's suppose we have declared an array of 5 int
:
int arr[5];
Then, on a platform where the size of an integer is 2 bytes (szeof(int) ==2
), the array will have its elements organized like this:

On a different platform, where sizeof(int) == 4
, it could be:

So the representation
{
11 --> location A
13 --> location B
17 --> location C
19 --> location D
}
is valid, considering B == A + 1
, C == B + 1
and so on.
Here, please note, the pointer arithmetic regards the data type, so A+1
will not result in an address with 1 byte
increment, rather the increment is by one element
. In other words, the difference between the address of two consecutive element will be the same as the size of the datatype (sizeof (datatype)
).