7

我意识到你们中 99% 的人都认为“这是什么鬼……”但是请帮助我理解使用pointers. 我相信我的具体问题会帮助很多新手。

我了解指针是什么,它们是对内存中地址的引用,并且通过使用 (*) 运算符,您可以获得该地址中的值。

比方说:

int counter = 10;
int *somePointer = &counter;

现在我在内存中有地址counter,我可以通过这样做间接指向它的值:

int x = *somePointer;

哪个使x = 10,对吗?

但这是最基本的示例,对于这种情况,我可以使用int x = counter;并获取该值,所以请解释为什么指针在 Objective-C 和其他一些语言中真的如此重要......感觉?

欣赏它。

4

4 回答 4

5

Objective-C 有指针,因为它是 C 的演变,它广泛使用指针。在像 Objective-C 这样的面向对象语言中指针的优点是,在创建对象后,您可以传递指向对象的指针,而不是传递对象本身。换句话说,如果您有一些占用大量存储空间的对象,则传递指针比传递对象本身的副本更节省内存。当您只处理像ints 这样的原始类型时,这在简单的情况下可能并不明显,但是当您开始处理更复杂的对象时,内存和时间节省是巨大的。

更重要的是,指针使代码的不同部分容易相互通信。如果变量只能“按值”而不是“按引用”传递给函数(使用指针时会发生这种情况),那么函数永远不会改变它们的输入。它们只能通过返回值或更改全局变量来更改程序的状态——过度使用通常会导致代码草率、无组织。

这是一个具体的例子。假设您有一个将解析 JSON 字符串并返回的 Objective-C 方法NSDictionary

+ (NSDictionary *)parseJsonString:(NSString *)json
                            error:(NSError **)error;

NSDictionary如果一切顺利,该方法将进行解析并返回一个。但是如果输入字符串有问题怎么办?我们想要一种方法来向用户(或至少向程序员)表明发生了什么,所以我们有一个指向 an 的指针的指针NSError,它将包含该信息。如果我们的方法失败(可能返回nil),我们可以取消对参数的引用error,看看出了什么问题。我们有效地做的是给我们的方法两种不同的返回值:通常,它会返回一个NSDictionary,但它也可以返回一个NSError

如果您想了解更多关于此的内容,您可能会更幸运地搜索“C 中的指针”而不是“Objective-C 中的指针”;指针当然在 Objective-C 中广泛使用,但所有底层机制都与 C 本身相同。

于 2013-02-20T23:13:24.573 回答
2

在 ObjectiveC 中使用指针的最大优势是什么

我想说最大的优点是你可以使用 Objective-C - 所有的 Objective-C 对象都是指针,都是使用指针访问的(编译器和运行时不会让你静态地创建对象),所以你不会没有他们就走得更远...

于 2013-02-20T23:13:10.760 回答
1

物品:

如果我告诉你写一个程序来维护一组计数器,但计数器的数量将由用户在启动程序时输入。我们使用分配在堆上的整数数组对此进行编码。

int *counters = malloc(numOfCounters * sizeof(int));

Malloc 直接使用内存,因此它本质上返回一个指针。所有 Objective-C 对象都是用 进行堆分配的malloc,所以它们总是指针。

物品:

如果我告诉你给我写一个读取文件的函数,然后在完成后运行另一个函数会怎样。但是,这个其他功能是未知的,并且会被其他人添加,我什至不认识的人。

为此,我们有“回调”。您将编写一个如下所示的函数:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *));

最后一个参数是指向函数的指针。当有人调用您编写的函数时,他们会执行以下操作:

void MyDataFunction(char *dataToProcess);

ReadAndCallBack(myFile, 1024, 0, MyDataFunction);

物品:

将指针作为函数参数传递是从函数返回多个值的最常见方式。在 OSX 上的 Carbon 库中,几乎所有的库函数都返回错误状态,如果库函数必须返回对程序员有用的东西,就会出现问题。所以你传递你希望函数将信息传回给你的地址......

int size = 0;
int error = GetFileSize(afilePath,&size);

如果函数调用返回错误,则它在 中error,如果没有错误,error则可能为零并且size包含我们需要的内容。

于 2013-02-20T23:19:42.480 回答
-1

在 Objective-C 或任何具有动态分配的语言中,指针的最大优点是您的程序可以处理比您在源代码中发明的名称更多的项目。

于 2014-03-22T15:00:59.810 回答