That is correct.
In C there is no such thing as a "string". I think the largest single "atomic" variable is the "long long" - 64 bits. Anything made up of more than one element, as in an array of elements (which a string is, after all - an array of "char" variables) is actually only a block of reserved memory pointed to by the variable.
When you first declare the variable with [...] you set aside that block of memory, and the variable points to the start of it. All operations on that variable are done as a pointer to that memory.
So, the following two statements are the same:
data = 'F';
*(data+3) = 'F';
That is, the "array entry number 3" and "the address 3 places higher than where data is pointing".
So, logically, when you pass the data variable to a function it is actually the pointer to the start of the memory area that you are passing.
It is not possible to pass a whole block of memory to a function, as there is no single data type that is that block of memory, only the pointer to where it starts.
If you want to protect the contents of the string within the function then you will have to manually copy the data into a temporary array within the function and work on that. You can use strdup() or strcpy() (the latter allocates memory for you - don't forget to free it), or memcpy() if the data isn't a string (the str*() functions copy up to the terminating null character).
And don't worry if it's confusing - it took me 6 years to learn how pointers work