Are C++ array items guaranteed to be in contiguous addresses?
Yes.
Should I be able to access the rest of the array inside of that function by calculating these offsets?
Yes. In fact, this is an idiomatic way to iterate over array elements. Pointer to element of an array is an iterator.
Object* a0 = a; Object* a1 = a0 + sizeof(Object) Object* a2 = a0 + sizeof(Object)*2
In this example, a1 will not point to the next sibling of a0 unless the size of the object happens to be 1. Pointer arithmetic works in units of object size, not in units of bytes. In other words, to get pointer to the next element, you write a0 + 1. To get the element itself, you can combine pointer arithmetic and indirection by using the subscript operator: a0[1].
func(foo);would be the usual way of doingfunc(&foo[0]);.