Your function returns a char (it returns the char 'C', and just that char - it does not return anything else and when the function finishes, the array you made here char buffer = "Captain <>"; effectively ceases to exist - trying to use it is wrong).
Anyway, back to your function. It returns a char. You then try to make the object name (which is effectively a char-pointer) equal to that char. You cannot make a char-pointer equal to a char.
return &buffer;return buffer; I think you meant? Returning &buffer will return the address of a pointer that itself contains the address of the 'C'.
return the memory address of buffer rather than a pointer.
A pointer is a memory address (or NULL). The only way to return a memory address without using a pointer is by casting it into some other form (such as an int), and changing it back again afterwards, which is possible but pointless.
Anyway, that will make it compile, but since at the end of the function, all the local variables are destroyed, the code will be accessing memory that might contain the data and might contain whatever else has been written over it. This is a bigger conceptual issue than just making sure to return a pointer :) Returning a pointer to the array does not return the array; the array will die when that function ends.
Your solution is still bad. You are relying on a section of memory holding Captain <> not to be disturbed, even though it is free for reuse. You are copying it as fast as you can in an attempt to make sure that you get it before it is written over ( strcpy( name, getbuffer() ); ) but that's just tilting the odds in your favour. Why not make something that doesn't rely on luck to work? For example: