Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 分配指针-目标-C_Objective C_Xcode_Variables_Pointers - Fatal编程技术网

Objective c 分配指针-目标-C

Objective c 分配指针-目标-C,objective-c,xcode,variables,pointers,Objective C,Xcode,Variables,Pointers,过去我主要是在.NET中编程,因此我不必特别担心指针之类的问题,但最近我进入了Objective-C,我决定尝试并充分理解内存管理的工作原理 首先,我想说,我知道你不应该为int做指针,因为它无助于提高效率,但这主要是出于好奇的一个实验 如果我创建一个整数指针,如下所示: int*int指针; 当我这样做时,指针指向的内存位置是如何分配的: intPointer = 43; 据我所知,这样的操作不应该改变指针的实际内存地址吗 这段代码也是如此: int *intPointer; int int

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

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

如果我创建一个整数指针,如下所示: int*int指针; 当我这样做时,指针指向的内存位置是如何分配的:

intPointer = 43;
据我所知,这样的操作不应该改变指针的实际内存地址吗

这段代码也是如此:

int *intPointer;
int integer;

integer = 43;
intPointer = integer;
同样的结果,但当我使用CLLocationCoordinate2D并试图使指针指向CLLocationCoordinate2D变量时,我实际上必须执行以下操作:

CLLocationCoordinate2D *coordinatePointer = &coordinate;
在我看来这是正确的方法

这是我在stackoverflow上的第一篇文章,我希望这篇文章足够好,可以得到回复。 谢谢大家!

intPointer = integer;
这只适用于隐式转换。指针只是一个内存偏移量,它是数值的,所以可以从int赋值(您应该得到编译器的警告)


在CLLocationCoordinate2D的情况下,结构不能转换为指针,所以编译器报告错误。当您编写
坐标时,它会引用变量
坐标
,指针可以分配给该变量。

您最初的假设是无效的:

intPointer=整数

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

intPointer=&integer

只有这样,integer的内存才会存储在intPointer中。然后,如果执行此操作:

整数=60

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

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

int *intPointer;
int integer;

integer = 43;
intPointer = integer;
第二个赋值将不会使用编译器的任何正常生成设置进行编译(但可以设置生成设置以使其编译。请检查收到的警告)。正确的方法是

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


下一步是学习Objective-C对象

那么,隐式转换是否会将
intPointer=integer
转换为类似
intPointer=&integer
的内容,或者该代码实际上是在更改指针的内存偏移量?我检查了
intPointer
指向的值,当我使用
intPointer=integer
时,它确实正确地分配了值。
intPointer=&integer
intPointer=integer
都只是更改了intPointer指向的偏移量。唯一的区别是intPointer最终将具有的值。在第一种情况下(
&integer
),它将指向
integer
变量,因此
*intPointer=42
将42写入
integer
变量。在第二种情况下,它将指向内存地址43(变量
integer
的值),因此写入
*intPointer=42
很可能会引发错误的访问异常,因为您无法写入任何随机地址。@FabianLindfors-上述答案给人的印象是,将整数指定给指针是可以的。不是。你永远不应该这样做(至少在你真正了解发生了什么并意识到这是一个糟糕的想法之前)。感谢你如此快速和一致的回答,编程真的是一件痛苦的事情,尤其是当你已经做了这么长时间,但仍然不知道这样的基本知识时。我建议你买一本比尔·杜德尼的电子书,在iBooks商店里你需要知道的所有C。这将给你一个很好的C介绍,并记住Objective-C。糟糕的代码气味难闻。您几乎从未在objective-c中使用过&运算符。@bbum-几乎从未使用过
n错误**
…您永远不应该说
intPointer=43。这就是给指针指定一个伪值,使指针不再是有效指针。(在你继续编程之前,请先读一些好的C语言书籍。)@CRD他的观点是,out参数是很少见的。上一次使用与错误无关的out对象参数是什么时候(有充分的理由)?C疯狂地使用它们进行计数和模拟多重回报。