Objective c 目标C语言中的变量地址

Objective c 目标C语言中的变量地址,objective-c,Objective C,我知道如果计算机是64位的,那么一个int变量占用4个字节。我尝试通过以下代码来测试这一点 int c = 16; int f = 11; NSLog(@"&c = %p &f = %p", &c,&f); 输出为: &c = 0x7fff570c8a4c &f = 0x7fff570c8a48 差异为4,这是否意味着变量占用4个字节?int的指针和int变量存储在计算机、堆栈或堆中的什么位置?指针和变量是否存储在不同的位置 我想了解为什么in

我知道如果计算机是64位的,那么一个int变量占用4个字节。我尝试通过以下代码来测试这一点

int c = 16;
int f = 11;
NSLog(@"&c = %p &f = %p", &c,&f);
输出为:

&c = 0x7fff570c8a4c &f = 0x7fff570c8a48
差异为4,这是否意味着变量占用4个字节?int的指针和int变量存储在计算机、堆栈或堆中的什么位置?指针和变量是否存储在不同的位置


我想了解为什么int的地址与2的差异是4。

是的,它确实意味着变量占用了4个字节。您询问的指针存储在堆栈上,用于调用NSLog

我知道如果计算机是64位的,那么一个int变量占用64/8=8字节

一般来说,情况并非如此。例如,64位Windows系统使用32位整数

无论如何,变量在堆栈上的位置是任意的,不能依靠它来确定这些变量的大小。在这种情况下,这些变量占用四个字节是正确的,但并非在所有情况下都是如此。如果你需要确定一个系统内的系统的位,考虑一个指针的大小,例如

sizeof(void *)

对于使用32位地址的系统,它总是返回4,对于使用64位地址的系统,它总是返回8。

为什么您认为int是64位的?请尝试sizeofint*CHAR_位。许多64位编译器将int保持为4字节。有效地使用处理器缓存非常重要。检查您的编译器。堆栈分配的变量不必在内存中连续排列,因此谈论一对局部变量之间的距离几乎毫无意义,更不用说指针算法在不在同一数组上的指针之间,或者在结束后的一个元素之间是未定义的。然而,64位系统中INT必须为8字节的逻辑是有缺陷的;它们可以是4个字节,理论上甚至可以是标准规定的最小值2个字节。我是唯一一个从未在C上看到NSLog函数的人吗?但仅仅是在Objective-C上?要达到非常低的水平,我们在谈论x位计算机时的意思是,处理器数据总线的宽度是x位。这与C中的数据类型大小没有任何关系?我的回答直接明了。没错,我没有否决你,但你的回答并不一定正确。例如,int可能占用2个字节。参数也可能位于堆栈以外的位置,通常是寄存器。这个答案缺乏细节,做出错误的假设,并且没有指出OP代码中的一些问题。指针算术是未定义的,除非两个指针都属于同一数组,或者一个元素超过了末尾。因此,从技术上讲,代码具有UB。用这种方法证明int是4字节是有缺陷的。sizeof通常是一个更合理的选择。@TheodorosChatzigiannakis,虽然int可以占用2个字节,但OP的输出表明,在他的情况下,它并不是这样。参数的替代位置当然是可能的,但堆栈是最常见的。@FilipeGonçalves,1它缺乏细节,因为它只是直接的。他没有像通常那样要求全面的理解。2它做出了假设,但没有证明这些假设是错误的,甚至不太可能。3它没有指出OP代码中的一些问题,因为他没有要求。你能告诉我为什么2的地址int是4吗?@Jay NSLog@%d,sizeofint。