There are some excellent answers in this thread, but I'd like to add one meant for a person who learned computer programming starting from a strongly-typed language like Java or C#, and never programmed in a weakly-typed language like C or C++.
(Note that I'm talking about strong vs. weak typing, not dynamic vs. static typing. The exact definition of weak typing is a fascinating discussion on its own, but outside of the scope of this answer :)
To understand null-terminated strings we need to start from how the data is stored in weakly-typed systems. In these systems the entire memory is just one big sequence of bytes and the program has access to any of these bytes at any time. It is up to the program to interpret the bytes correctly. For instance, when the program needs to read an 32-bit integer at address A1, it reads 4 bytes starting at address A1 and interprets them as a single 32-bit integer. It knows that 32-bit integer is 4 bytes of size, so it doesn't need to have any marker for where is the integer supposed to end.
This is not true about text strings, which in most languages can be of arbitrary size, and are represented by a single byte per character (or 2 bytes for UNICODE strings). Thus knowing the starting address of a string does not mean the program knows where the string ends. Keep in mind - in weakly-typed languages there is nothing stopping the program from reading the memory beyond the end of the string and keep interpreting the bytes that represent the data stored behind the string as further characters.
So in order to read a text string at address A2 the program needs a way of knowing how long the string is, so that it knows how many bytes it should read. Some languages will deal with it by storing the size of the text string in the first byte (or 2 or even 4 bytes). A string "foo" might be 4 bytes long and look like this:
3 102 111 111
where 3 is the length of the string and 102 and 111 are ASCII codes for the characters 'f' and 'o'. This is pretty simple, but limits the maximum length of any string, in this case to 255 characters (since 255 is maximum integer value that can be stored in a single byte we used to keep the length of the string).
Another way of dealing with this problem is marking the end of the string, and this is exactly what a null-terminated string does. It uses a NULL character represented by ASCII value of 0 (zero). So the same string "foo" might look like this:
102 111 111 0
Note that in this case there is no limit for the length of a string that can be represented in this format and the overhead of the representation is always exactly one byte (the finial zero). Obviously text strings containing the NULL character cannot be represented as null-terminated strings at all.