4

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

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

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

intPointer = 43;

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

这段代码也是如此:

int *intPointer;
int integer;

integer = 43;
intPointer = integer;

结果相同,但是当我使用 CLLocationCoordinate2D 并尝试使指针指向 CLLocationCoordinate2D 变量时,我实际上必须这样做:

CLLocationCoordinate2D *coordinatePointer = &coordinate;

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

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

4

3 回答 3

2
intPointer = integer;

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

在 CLLocationCoordinate2D 的情况下,struct 不能转换为指针,所以编译器会报错。当您编写 时&coordinate,它会引用coordinate可以分配指针的变量。

于 2013-07-07T01:28:31.847 回答
1

您最初的假设是错误的:

intPointer = 整数;

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

整数指针 = & 整数;

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

整数 = 60;

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

于 2013-07-07T01:38:54.580 回答
0

你问的问题都是关于纯 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 对象。

于 2014-03-22T14:05:12.957 回答