1. No, not really - at least if I understand what you're saying. You could write a program that uses arrays with a terminator value like strings, but with different types. NULL or anything like it is good for pointer arrays, or -1 might be good for integer arrays. A terminator can't be valid program values, so picking one for any random plain old builtin type could be hard. The only institutionalized terminator is for C strings, and that terminator is the zero character: '\0', since the functions in cstring library depends on it being present at the end of any C-string.
2. If you followed 1, you can write a function yourself. Otherwise you're supposed to use a variable with the size in it, if it's a real array. C++ has handy containers though, such as vector, that have a size() method.
3. Arrays of arrays have to drill-down to get to what you need.
Code:
std::string fruits[] = { "Banana", "Orange", "Grape", "Pomegranate" };
We have a flat array of strings and each first letter is different. 'P' is at fruits[3][0], the third index of fruit--the 0th index of fruit[3].
4. You should get various compile-time errors, especially with the sample code you gave. It isn't valid because you are missing too many dimension sizes (only the first dimension can be omitted) and passing an array with too few dimensions anyway should never match the parameter type.
5. No, write one.