@Caleb1994
It makes sense if you think about it. A string, is a series of bytes, one after another all linked together like a, well you guessed it, string. It's really like an array of bytes. It's length can change so it's not like an integer or a float where the number of bytes is fixed. When you use commands like MID$() or LEFT$() etc., you are actually referenceing memory pointer positions within the string relative to the start of the string's memory address.
Even the type LPCSTR gives you a clue: LP means long pointer, so you have to pass a 4 byte DWORD or long as a memory address. C means that the pointer is a constant, and STR is to help you identify that it is a character string that you are dealing with. And if it's a character string then the type is char which is equal to 1 byte per memory position. So if you read LPCSTR outload it might sound like "A Long Pointer Constant to a Character String". If there was a W in the type, LPCWSTR, that would mean an unsigned short or a WORD, is the pointer type. That means it requires 2 bytes for each character per memory position. This is for unicode values - international character sets and the like. That is why you will see winapi dll functions with an A or a W at the end. A is for ascii and w is for unicode. For DBC, it's best to use the functions with the A on the end because I don't think DBC passes unicode values.
Enjoy your day.