据我所知(或者我认为我理解),作为指针的变量只存储其值的内存地址。
让我们说:
int x = 5;
NSString *str1 = [NSString stringWithCString:"one"];
然后x的值为5.这就是我在调试器中看到的,当我在那里放置一个断点时。
但:
str1的值不是“一”。它是一个像bfffd3d0这样的内存地址。这就是我在调试器的“值”字段中看到的,当我停在那里时。因此,这个bfffd3d0内存地址背后是NSString对象,它具有巨大的数据结构(假设它很庞大),大量的实例变量,值等等。这几乎是对的吗?
我不是在谈论变量名本身的内存,而是关于变量“引用”或指向或存储或其他任何内容的值。
答案 0 :(得分:7)
你是对的,是的。
“这个bfffd3d0内存地址后面是NSString”可能更好地说“ 这个bfffd3d0内存地址......”
答案 1 :(得分:2)
或多或少,我会在这里迂腐。正如您所说,str1
的值是存储“一”的位置,而不是“一”本身。
但是,由于几个原因,它并不完全是内存地址。首先,您的应用程序在虚拟内存上工作的硬件原因,甚至从未看到实际的内存地址。值(比如0xbfffd3d0
)只是实际内存地址映射到的虚拟内存地址。它甚至可能根本不对应于存储器地址。它可能是未映射的(因此访问此地址会给您一个分段错误/访问冲突,或者它可能是内存映射并由文件或硬件设备支持。写入此“地址”可能实际上没有将数据写入内存,而是向GPU发送信号。
第二,语言律师的理由:指针不是地址。 有些操作在地址上有效,但对于指针是未定义的。 NULL指针可能指向其他地址而不是0.指向同一数组的指针可能无法进行相等性比较,即使在内存地址上这样做也很有意义。
This link详细介绍了这种情况(特别是对于C ++,但对C和obj-C来说基本相同。)
但简短的回答是,指针的设计使得它们可以通过编译器实现作为(虚拟)内存地址。所以在实践中,它们的行为往往相同,但是的差异,假设指针只是,内存地址会在某些时候导致错误。< / p>
在您询问的情况下,您完全正确,指针变量存储了可以找到数据的位置,而不是数据本身。
答案 2 :(得分:1)
是的,这是一个非常接近的描述。
重新启动other question,实际上对NSLog
的调用会将变量的地址传递到堆栈,但@"%x"
告诉NSLog
将该地址解释为整数
答案 3 :(得分:1)
您将此标记为objective-c,但“指针”并非仅针对objective-c。其他语言如C ++也有指针。
答案 4 :(得分:1)
如果通过内存地址表示RAM,那么它并不完全正确。指针可以包含映射设备的地址(例如,视频卡,网卡等)。
答案 5 :(得分:1)
据我所知,指针指向一个内存地址,该地址保存的值可以通过解引用指针获得
int number = 14;
int* ptrNumber = &number; //the value of the pointer is now the address of number
int n=*ptrNumber; //pointer was dereferenced, so n is now the value at the address of ptrNumber (n = 14)