【问题标题】:Assigning pointers - Objective-C分配指针 - Objective-C
【发布时间】:2013-07-07 01:18:55
【问题描述】:

过去我主要使用 .NET 进行编程,因此我不必特别担心指针之类的事情,但最近我进入了 Objective-C,我决定尝试并完全理解内存管理的工作原理。

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

如果我这样创建一个整数指针: 整数 *intPointer; 当我这样做时,为什么实际上是指针指向的内存位置被分配:

intPointer = 43;

据我了解,这样的操作不应该是改变指针的实际内存地址吗?

这段代码也是如此:

int *intPointer;
int integer;

integer = 43;
intPointer = integer;

同样的结果,但是当我使用 CLLocationCoordinate2D 并试图使指针指向 CLLocationCoordinate2D 变量时,我实际上不得不这样做:

CLLocationCoordinate2D *coordinatePointer = &coordinate;

在我看来,这似乎是正确的方法。

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

【问题讨论】:

  • 我建议购买 Bill Dudney 的电子书,在 iBooks 商店中您需要知道的所有 C。这将为您提供一个很好的 C 介绍,同时考虑到 Objective-C。
  • 坏代码气味难闻。你几乎从不在 Objective-c 中使用 & 运算符。
  • @bbum - 几乎从来没有? NSError ** ...
  • 你永远不应该说intPointer = 43;。那就是为指针分配一个虚假的值,使指针不再是有效的指针。 (在进行更多编程之前,请阅读一些好的 C 书籍——拜托。)
  • @CRD 他的观点是输出参数很少见。您最后一次使用非错误相关的输出对象参数是什么时候(有充分的理由)? C 疯狂地使用它们进行计数和模拟多个返回。

标签: objective-c xcode variables pointers


【解决方案1】:
intPointer = integer;

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

在CLLocationCoordinate2D的情况下,struct不能转换为指针,所以编译器报错。而当你写&coordinate时,它给出了一个变量coordinate的引用,这个指针可以被分配到。

【讨论】:

  • 那么隐式转换是否将intPointer = integer 转换为intPointer = &integer 之类的东西,或者该代码实际上是否更改了指针的内存偏移量?我检查了intPointer 指向的值,当我使用intPointer = integer 时,它确实正确分配了它。
  • intPointer = &integerintPointer = integer 都只是改变了 intPointer 指向的偏移量。唯一的区别是 intPointer 最终将具有的值。在第一种情况下(&integer),它将指向integer 变量,因此*intPointer = 42 会将42 写入integer 变量。在第二种情况下,它将指向内存地址 43(变量 integer 的值),因此写入 *intPointer = 42 很可能会引发错误访问异常,因为您无法写入任何随机地址。
  • @FabianLindfors - 上面的答案给人的印象是,将整数分配给指针是可以的。它不是。你应该永远这样做(至少在你真正了解发生了什么并意识到为什么这是一个糟糕的想法之前不要这样做)。
【解决方案2】:

你最初的假设是错误的:

intPointer = 整数;

实际发生的情况是,如果将 10 存储在变量“整数”中,那么它将被复制到 intPointer 中。因此,当您尝试使用 *intPointer 从 intPointer 获取值时,它将为您提供存储在内存 10 中的值,该值可以是任何值。但如果你这样做:

intPointer = &integer;

只有这样整数的内存才会存储在 intPointer 中。然后如果你这样做:

整数 = 60;

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

【讨论】:

  • 感谢您提供如此快速和一致的答案,编程真的很痛苦,尤其是当您已经做了这么长时间但仍然不知道这样的基本知识时。
【解决方案3】:

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

int *intPointer;
int integer;

integer = 43;
intPointer = integer;

第二个分配将不会使用编译器的任何合理构建设置进行编译(但可以设置构建设置以使其编译。检查您收到的警告)。这样做的正确方法是

intPointer = &integer;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2012-05-14
    相关资源
    最近更新 更多