Serial.print and char[] & null
The "Serial" is a object/class and that makes it possible to have more than one function for Serial.print(). According to the type of the parameter the proper Serial.print() is selected.

This is the include file for the Serial.print(): Print.h
And these are the possibilities:


size_t print(const __FlashStringHelper *);
size_t print(const String &amp;);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&amp;);


The reference for Serial.print() is short, but it explains pretty well that those different parameters are possible.

Your Serial.print(88, DEC); does not use a string of text, it uses the integer number 88. 

As soon as a string of text is used, it should be zero-terminated.
The line char buff[3] = "ABC"; is indeed wrong, as you already wrote. That is one of the things of the 'c' language. The "ABC" gets a zero-terminater and that makes 4 bytes.