Earlier quoted context omitted.
They are a pointer and an offset with no validation of bounds. But that's OK: C is little more than a high level assembly.
I hate the term "high level assembly" when applied to C since it's loaded against assembly (in the sense of C as its superset) which is obviously not true. C is full of undefined behavior, assembly is not.
Actually we often give up features and specialize with high level languages. That's why there are things easier to do in Ruby than in C++ and vice versa.
They are all (usually much more convenient) subsets of assembly.