Q:

What are the reasons for the decisions behind implementing strings as an array of chars with a null marker vs other approaches in C?

Looking into C for the first time, I found that a string is actually a char[] - and I was wondering how many different ways there are of implementing a string datatype as a result? 
A comment on this question (Why does a string of N chars require initializing an array of N + 1 chars in C?)

For a string datatype, you need to know the length. You can either have a struct that has a length field (and the char array), or you need a special marker to signal the end of the string. In C the special marker method has been chosen and the marker is a null character

Implies there are just two means of achieving a string structure?

A char[] with a null marker
An object of sorts that provides a pointer to the start of a char[] and other necessary metadata

Are there other means of implementing a string datatype? Why did C take approach (1)? 

A:

Why did C take approach (1)?
According to The Development of the C Language, it was to avoid fixing the maximum length of a string, and that their personal experience led them to believe a terminator was more convenient.

None of BCPL, B, or C supports character data strongly in the language; each treats strings much like vectors of integers and supplements general rules by a few conventions. In both BCPL and B a string literal denotes the address of a static area initialized with the characters of the string, packed into cells. In BCPL, the first packed byte contains the number of characters in the string; in B, there is no count and strings are terminated by a special character, which B spelled *e. This change was made partially to avoid the limitation on the length of a string caused by holding the count in an 8- or 9-bit slot, and partly because maintaining the count seemed, in our experience, less convenient than using a terminator.

Are there other means of implementing a string datatype?
Nothing significantly different, as long as a string is defined to consist of contiguous bytes.

