【问题标题】:Is there an Ultimate Guide to Pointers in Objective-C? [closed]Objective-C 中的指针有终极指南吗? [关闭]
【发布时间】:2011-08-05 12:47:29
【问题描述】:

好的...我了解指针是什么以及它们如何指向存储变量的内存位置。

但是,何时使用指针(星号)以及何时不使用,我仍然无法完全理解。这对我来说似乎仍然是随机的。

有没有人对网络上的优秀教程或真正详细介绍指针的书籍章节有任何建议?

谢谢!

编辑:我真正想要的是一个详细的指南,它是特定于 Objective-C 的,无论是在深度网站教程还是书籍章节中。我认为这里没有足够的篇幅来为我完全解释。

【问题讨论】:

标签: objective-c


【解决方案1】:

注意这被标记为 Objective-C..

看看here

【讨论】:

  • 我知道 Obj-C 是 C 的超集,但我正在寻找更具体的 Objective-C(和 Cocoa)的指南。例如为什么 NSLog(@"myString is equal to %@", myString);使用“myString”而不是“*myString”或“&myString”
  • @sayguh:这是因为%@ 指示格式化程序获取该地址处的指针并向其发送-description 消息,然后在该点格式化结果字符串的内容。 %@object 就像 %s[[object description] UTF8String]
【解决方案2】:

(Un)幸运的是,星号* 有许多不同的含义,具体取决于上下文。那么,让我们看看相关的。让我们为一些任意类型写T(比如int):

T x;     // variable of type x, stored somewhere in memory

T * pt;  // a pointer to a variable of type x -- doesn't have a value just yet

pt = &x; // the value of pt is now the address of the variable x

到目前为止一切顺利。我们使用星号来指定一个新的类型,即T*,它是一个“指向T的指针”。

但是我们如何处理指针呢?我们可以取消引用它来获取变量指针指向的地址的值

T y;      // another variable of type T
y = *pt;  // equivalent to y = x;

*pt = 81; // equivalent to x = 81;

所以,如果星号是类型名的一部分,那么它指定了一个指针类型。如果它出现在变量名之前(它本身就是指针类型),那么它会取消引用指针。

[澄清:] 在 C 中,指针自然与“address-of”运算符 & 密切相关,后者用于实际获取指向某物的指针。 在 Obj-C 中,作为对象分配(+初始化)的结果得到一个指针:T * pt = [T new];

请注意,Obj-C 提供了传统 C 和 C++ 指针语法的替代语法,因此您可能会遇到其他形式的指针。[/Clarification]

(星号当然也可以用作二元运算符,所以你可以有这样的东西:int x = 5; int * p = &x; int y = *p * *p;。)

【讨论】:

  • 他说的是 Obj-C。这是完全不同的。所有对象(类的实例)都是那里的指针......
  • 而且 Obj-C 没有像 C++ 这样的引用类型。它是纯 C 语言,带有面向对象、类似 Smalltalk 的扩展。
  • @Rudy:我根本没有提到参考资料。 (实际上,在 C++ 中,取消引用的类型是 T&,但我在这里不是这么说的。) Tim:Objective-C 不是 C 的超集吗?所有的 C 指针机制也应该适用于那里吗?如果没有,我会删除这篇文章。
  • 虽然您可以使用&-symbols 作为pass-by-reference-flags,并在接收方法中将它们指定为NSError **,但我们(几乎?)从不使用* 和@987654337 @ 用于任何其他目的。这是我们初始化对象的方式:en.wikipedia.org/wiki/Objective-C#Instantiation
  • @Kerrek SB:很好,但是,C# 与 Obj-C 完全不同:P! C = C Sharp,由微软开发,用于开发 Windows 应用程序。
【解决方案3】:

Growl 和 Adium 的 Peter Hosey 在他的博客上发布了指针指南。他称之为"Everything you need to know about pointers in C,",但那是因为他认为丑陋的指针方面属于C 而不是Obj-C。看看吧。

我不知道除了 Clang ARC reference 之外的任何引用,它描述了您现在可以在 Obj-C 中放置指针的所有疯狂修饰符。如果您已经感到困惑,那么这不是一个很好的学习资源。

【讨论】:

    【解决方案4】:

    假设 C 指针对你来说没有什么秘密,基本上在 Objective-C 中有两个警告要避免:

    • NS- 前缀并不总是表示一个类。有时这只是一个 typedef。您必须查看参考手册。

    • 在 Objective-C 2.0 中引入了点符号。尽管每个对象都是一个指针,但有时实例变量可以通过myObj.myVar 访问,而不是(对于新手来说更一致)myObj->myVar

    【讨论】:

      【解决方案5】:

      指针的终极指南在 Kernighan & Ritchie. 中它们在 Objective-C 中和在 C 中是一样的。

      【讨论】:

      • Objective-C 中的实例与 C++ 中的实例完全不同。在 Objective-C 中,对象总是带有星号。
      • NSString* 只是一个指针,一个类似于 char* 的指针,只是它们指向不同的类型。
      • K&R 不会开始解决像__weak __block MyClass *me 这样的声明的复杂性,也不会讨论从id 到任何其他对象类型的隐式强制。它也不包括 restrict,它自 1999 年左右以来一直是标准 C 的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多