Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Objective C_Variables_Pointers - Fatal编程技术网

指针与变量,Objective-C

指针与变量,Objective-C,objective-c,variables,pointers,Objective C,Variables,Pointers,我是Objective-C的初学者,很难理解指针和变量之间的区别。例如,它们之间的区别是什么 整数=30 int*pointerNumber=30 如果有人能给我解释一下,我将不胜感激。变量包含值,而指针包含内存地址,其中变量/值是指针只是一个句柄、位置或内存地址。所以你用一个指针,你不是直接操作一个东西,你是在操作内存中指针指向的东西 但是,对于像int这样的标量值,您可以直接处理该数据段。给定的语言如何使用指针和值取决于该语言,因此它们的存储位置、访问方式等都会产生影响 这还不是全部,但这是

我是Objective-C的初学者,很难理解指针和变量之间的区别。例如,它们之间的区别是什么

整数=30

int*pointerNumber=30


如果有人能给我解释一下,我将不胜感激。

变量包含值,而指针包含内存地址,其中变量/值是

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

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

这还不是全部,但这是最简单的解释方式

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

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

这里有一些关于

下面是Objective-C中的一个例子来指出这一点

让我们暂时假设我们有一个简单的iOS或OSX应用程序,它遵循苹果的Objective-C标准和库。我们还假设有一个类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
我在这里演示的不仅仅是指针的概念,还有通过引用传递的概念。除此之外,我还展示了指针和由变量表示的标量值之间的区别。当我们将“variable”(您称之为“variable”)传递给一个方法时,它在该方法中被修改,但正如您所看到的,原始变量保持不变,并且在该方法中使用的内容被修改后没有改变。只传递了值,而不是对该原始值的引用

但是,对于对象,我们传递了一个指向该对象的指针。由于我们修改了由该点表示的对象,在内存中的该位置,对象内部的值确实发生了变化,因为我们实际上是在对同一对象进行操作。我们知道在记忆中去哪里寻找它

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

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

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

这是一个非常广泛的问题,在互联网和书籍上都有很多很好的答案。你能再具体一点吗?你懂什么,你不懂什么?有时候,直接问一个人比查阅文本更容易学会。指针只是机器RAM中的任意位置。通常它“指向”存储在RAM中的一些数据,但最终它只是一个数字,32位处理器上是32位整数,64位处理器上是64位整数。Objective-C没有指针,但它从C继承并一直使用它们。See和maybe以及@Zarazthuztra的可能副本是的,正如我说的,它们一直在使用。但是它们存在于C语言中,因此您应该查找C语言以了解它们是如何工作的。把它放在“objective-c上下文”中不会有任何效果,如果你不学习c,你就不能正确地学习Obj-c,既然Obj-c是c的超集,你应该先学习c。非常感谢你的详细回答!我现在清楚地知道了指针和原语值之间的区别。另外,我来自VisualBasic。我很高兴它有帮助!我明白了,另一种非指向性语言;)技术上我应该澄清一下,我知道在Java中我们称之为原语,通用术语是标量值: