C is a smaller language on some axes. That's not necessarily a good thing.
Looking at the following function definition, can you figure out how to use it safely?
int foo(char* text, char* out,
char* s, char* x);
If you were to have the same signature in Rust, it would look more like the following:
fn foo(
text: String,
out &mut String,
s: &str,
x: &mut str,
) -> i32;
Now it is clearer that foo is responsible for getting rid of the allocation corresponding to text, which is on the heap. out can be modified and potentially reallocated. s is read only and it won't be deallocated by foo. x might be mutated in-place by foo, but it won't be deallocated.
Having a more "complex" way to represent in the typesystem something that C only bothers to call "a pointer" makes things better: safer, easier to skim, explore and understand an API, and allows the compiler to catch API misuses.