But I've found out that using functional parts of modern C++ (bear with me) as a higher level language with C underpinnings also works very well. But you need tremendous discipline to do it successfully. For eg - using only C POD structs, no constructors, no exceptions, no inheritance, limited template usage etc. Some would say a very C style C++ with a lot of syntax sugar.
These simple rules coupled with great modern C++ syntax sugar like lambdas, tuples and 'auto' along with the basic data structures in it's standard library makes it a breeze.
If you make a pigeon hole row of boxes, box number 1 has an index of 1 and an offset of 0 (from the origin mark).
C arrays are syntactic sugar for origin based offsets, Fortran arrays are indexed by element number.
In C arr[i] is equivalent to i[arr] is equivalent to arr + i and to i + arr.