【问题标题】:Pointers VS Variables, Objective-C [closed]指针VS变量,Objective-C [关闭]
【发布时间】:2013-12-17 03:46:27
【问题描述】:

我是 Objective-C 的初学者,我无法理解指针和变量之间的区别。例如,有什么区别

整数 = 30;

int *pointerNumber = 30;

如果有人能向我解释这一点,我将不胜感激。

【问题讨论】:

  • 这是一个非常广泛的问题,在互联网和书籍中有很多很好的答案。你能更具体一点吗?什么你明白,什么你不明白?
  • 有时候,问一个可以直接提问的人比查阅文本更容易学习。
  • 指针只是机器内存中的任意位置。通常它“指向”存储在 RAM 中的一些数据,但最终它只是一个数字,32 位处理器上的 32 位整数和 64 位处理器上的 64 位整数。 Objective-C 没有指针,但它从 C 中继承并一直使用它们。
  • @Zarazthuztra 是的,正如我所说,它们一直都在使用。但是它们存在于 C 中,因此您应该查找 C 语言以了解它们是如何工作的。把它放在“objective-c context”中没有任何效果,如果你不学习 C,你就无法正确学习 Obj-C,而且由于 Obj-C 是 C 的超集,你应该先学习 C。

标签: objective-c variables pointers


【解决方案1】:

指针只是句柄、位置或内存地址。所以你有一个指针,你不是直接操作一个东西,你是在操作指针指向的内存中的东西。

但是,对于像 int 这样的标量值,您正在直接处理该数据。给定语言如何使用指针和值取决于该语言,因此它们的存储位置、访问方式等都会受到影响。

这不是全部,但恕我直言,这是解释它的最简单方法。

现在,在 Objective-C 的上下文中,您不会真正找到很多指向 int 类型的指针,而是会找到一个 int 值。另一方面,对象疯狂地使用指针,它允许您将对象传递给方法,或者在消息中发送它,对其进行修改,并且仍然具有相同的对象,只是发生了变异。

但是,对于该 int,将其作为消息参数传递肯定会传递 int 的值,而不是对它的引用,因此原始 int 将保持不变。

这是pointers的一些文档

这里有一个Objective-C中的例子来指出这一点

让我们暂时假设我们有一个遵循 Apple 的 Objective-C 标准和库的简单 iOS 或 OSX 应用程序。我们还假设我们有一个类 Foo,具有适当定义的标头

#import Foo.h
#import Bar.h
@implementation Foo
    - (void) doSomethingWithPointer:(Bar)obj{
        obj.x = 5;
    }

    - (void) doSomethingWithValue:(int)num{
        int x = num;
    }

    - (void) doThings:{
    //Suppose I have an object of type Bar available to me. I'm going to get a pointer to a new instance of that object, freshly allocated into memory
    Bar *barObj = [Bar alloc];
    //we will assume Bar has only one feature, a publicly accessible property called x. It's of the int type, of value 1, but again, is part of the Bar object that we are POINTING to.

    //Now, here is a variable that is NOT a POINTER, it's merely a value in memory.
    int num = 1;

    //Let's call the two methods in this class that perform some action and see what happens.

    //first, our pointer
    NSLog(@"%d",barObj.x);//outputs 1
    [self doSomethingWithPointer:barObj];
    NSLog(@"%d",barObj.x);//outputs 5

    //Now, let's call on our variable that is just a  value and NOT a POINTER
    NSLog(@"%d",num);//outputs 1
    [self doSomethingWithValue:num];
    NSLog(@"%d",num);//outputs 1

}
@end

我在这里演示的不仅仅是指针的概念,还有引用传递的概念。除此之外,我还展示了指针和由变量表示的标量值之间的区别。当我们将您所称的“变量”传递给一个方法时,它在方法中被修改了,但是正如您所看到的,原来的内容保持不变,并且在方法中使用的内容之后没有改变。只有值被传递,而不是对该原始值的引用。

但是,在对象的情况下,我们传递了一个指向对象的指针。由于我们修改了该点表示的对象,在内存中的那个位置,对象内部的值 DID 发生了变化,因为我们本质上是在作用于同一个对象。我们知道在内存中的何处查找它。

如果这仍然没有意义,请在 cmets 中告诉我,我们会解决这个问题的 :)

如果您不太了解指针,我将假设您来自脚本或 Java 背景;)

作为旁注,为什么只有 obj-c 中的对象才会出现这种情况? 对象,或者更确切地说是类的实例,封装数据,并且该数据需要能够保持完整和传递,但如果发生突变,则无论对象的同一实例在哪里,该突变也需要反映在对象的状态中用过。

【讨论】:

  • 非常感谢您的详细回复!我现在清楚地知道指针和原始值之间的区别。另外,我来自 Visual Basic。
  • 我很高兴它有帮助!我明白了,另一种非指针语言;)从技术上讲,我应该澄清一下,我知道在 Java 中我们称它们为原语,通用术语是标量值:en.wikipedia.org/wiki/Variable_%28computing%29
【解决方案2】:

变量包含值,而指针包含变量/值所在的内存地址

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多