2013-07-07 77 views
3

在过去,我主要使用.NET进行编程,因此我不必担心指针等事情特别多,但最近我已经进入Objective-C并决定了尝试和充分理解内存管理的工作。指定指针 - Objective-C

所以,首先我想说我知道你不应该为int的指针,因为它不会提高效率,但这主要是一个出于好奇的实验。

如果我创建一个整数指针,如: int * intPointer; 如何来,它实际上是指针指向一个被分配当我这样做的存储位置:

intPointer = 43; 

正如我的理解是,不应该这样的行动会改变指针的实际内存地址?

这同样适用于这一段代码:

int *intPointer; 
int integer; 

integer = 43; 
intPointer = integer; 

同样的结果,但是当我与CLLocationCoordinate2D工作,试图让一个指针指向一个CLLocationCoordinate2D变量,其实我不得不这样做:

CLLocationCoordinate2D *coordinatePointer = &coordinate; 

对我而言,这似乎是正确的方法。

这是我在stackoverflow上的第一篇文章,我希望能够得到回答。 谢谢!

+0

我建议您通过Bill Dudney在iBooks商店购买您需要了解的所有C语言电子书。这将为您提供Objective-C的良好C介绍。 – uchuugaka

+0

坏代码的气味味道不好。您几乎从不在objective-c中使用&运算符。 – bbum

+1

@bbum - 几乎从不? 'NSError **'...... – CRD

回答

1
intPointer = integer; 

这只适用于隐式转换。指针只是一个内存偏移量,它是数字的,所以它可以从一个int中分配(并且你应该得到编译器的警告)。

在CLLocationCoordinate2D的情况下,struct不能转换为指针,所以编译器报告错误。当你写&coordinate时,它给出了可以指定哪个指针的变量coordinate的引用。

+0

因此,隐式转换将'intPointer = integer'转换为类似'intPointer =&integer'的东西或者是那个代码实际上改变了指针的内存偏移量?我检查了'intPointer'指向的值,当我使用'intPointer = integer'时,它确实分配了它。 –

+0

'intPointer =&整数'和'intPointer =整数'正在改变intPointer指向的偏移量。唯一的区别就是intPointer最终会有的价值。在第一种情况下('&integer')它会指向'integer'变量,所以'* intPointer = 42'将把42写入'integer'变量。在第二种情况下,它将指向内存地址43(变量'integer'的值),所以编写'* intPointer = 42'很可能会引起访问异常异常,因为您无法写入任何随机地址。 –

+1

@FabianLindfors - 上面的答案给人的印象是,将整数赋值给指针是可以的。不是。你应该永远不要这样做(至少在你真的了解正在发生的事情并意识到为什么这是一个可怕的想法之前)。 –

1

你最初的假设是工作,是假的:

intPointer = integer;

实际发生的事情是,如果您将10存储在变量“integer”中,则它将被复制到intPointer中。所以当你试图用intPointer从intPointer中获得值时,它会给你存储在内存10的值,这可能是任何东西。但是,如果你这样做:

intPointer =&整数;

只有这样整的记忆将获取存储在intPointer.Then以后,如果你这样做:

整数= 60;

那么* intPointer也会给你60个。 换句话说,intPointer的内存地址是整数,因此会指向整数。

+0

谢谢你这么快速和一致的答案,编程可能真的很痛苦,特别是当你这么做了很长时间但仍然不知道这样的基本东西。 –

0

你问的问题是关于纯C指针的问题。 Objective-C是C语言的补充(还有Objective-C++,它是C++的补充)。当您使用Xcode编写代码时,您可以决定编译器给您的警告以及这些警告是否应该视为错误。用最低的警告设置,编译器将接受绝对不应该接受的代码。在您的例子

int *intPointer; 
int integer; 

integer = 43; 
intPointer = integer; 

第二次分配将不与编译器,任何理智的构建设置编译(但有可能设置构建设置,使其编译。检查你有什么警告)。这样做的正确方法是

intPointer = &integer; 

intPointer =整数,如果你说服的编译器来编译它,将采取43号把它解释为一个指针。由于很有可能在内存位置43存储了任何明智的内容,因此使用intPointer读取或写入int很可能会崩溃。 intPointer = & integer取变量“integer”的地址并将其存储在指针intPointer中。现在,“intPointer”的值是整数的地址,而* intPointer的值是“整数”的内容,为43.

了解Objective-C对象是下一步。