There are countless questions about pointers here on SO, and countless resources on the internet, but I still haven't been able to understand this.
This answer quotes A Tutorial on Pointers and Arrays in C: Chapter 3 - Pointers and Strings:
int puts(const char *s);
For the moment, ignore the const. The parameter passed to
puts()is a pointer, that is the value of a pointer (since all parameters in C are passed by value), and the value of a pointer is the address to which it points, or, simply, an address. Thus when we writeputs(strA);as we have seen, we are passing the address ofstrA[0].
I don't understand this, at all.
- Why does - puts()need a pointer to a string constant?- puts()doesn't modify and return its argument, just writes it to- stdout, and then the string is discarded.
- Ignoring the why, how is it that - puts()'s prototype, which explicity takes a pointer to a string constant, accepts a string literal, not a pointer to one? That is, why does- puts("hello world");work when- puts()'s prototype would indicate that- puts()needs something more like- char hello[] = "hello world"; puts(&hello);?
- If you give, for instance, - printf()a pointer to a string constant, which is apparently what it wants, GCC will complain and your program will segfault, because:- error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[6]’
But giving printf() a string constant, not a pointer to a string, works fine. 
This Programmers.SE question's answers make a lot of sense to me.
Going off that question's answers,  pointers are just numbers which represent a position in memory. Numbers for memory addresses are unsigned ints, and C is written in (native) C and assembly, so pointers are simply architecture-defined uints.
But this is not the case, since the compiler is very clear in its errors about how int, int * and int ** are not the same. They are a pathway that eventually points to something in memory.
Why do functions that need a pointer accept something which is not a pointer, and reject a pointer?
I'm aware a "string constant" is actually an array of characters but I'm trying to simplify here.
 
     
     
     
     
     
     
     
    