More or less, and I'm going to be pedantic here. The value of str1
is, like you say, the location at which "one" is stored, rather than "one" itself.
However, it is not exactly memory address, for a couple of reasons. First, the hardware reason that your application work on virtual memory, and so it never even sees the actual memory addresses. The value (say 0xbfffd3d0
) is simply the virtual memory address to which the actual memory address has been mapped. It may not even correspond to a memory address at all. It may be unmapped (so accessing this address will give you a segmentation fault/access violation, or it may be memory-mapped and backed by a file or a hardware device. It is possible that writing to this "address" doesn't actually write data to memory, but instead sends a signal to the GPU.
And second, the language-lawyer reason: Pointers are not addresses.
There are operations that would be valid on addresses, but are undefined for pointers. The NULL pointer may point to other addresses than 0. Pointers that do not point to the same array may not be compared for equality, even though it'd make perfect sense to do so on memory addresses.
This link goes into more detail about the situation (specifically for C++, but it is basically the same for C and obj-C.)
But the short answer is that pointers are designed so that they can be implemented bby the compiler as (virtual) memory addresses. So in practice, they tend to behave much the same, but there are differences, and assuming that a pointer is just a memory address will lead to errors at some point.
And in the case you ask about, you're exactly right, a pointer variable stores the location at which data can be found, rather than the data itself.