Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

2.9 指针

相信很多学习过C语言的读者会对指针操作记忆深刻,对于初学者,指针真的让人头疼。不过,在我们的代码中,指针却又是必不可少的编程工具,我们还是先简单了解一下吧。

首先,我们从形式上看一下指针与普通变量有什么不同,如下面的代码。

    int numInt = 99;
    int *ptInt = &numInt;

代码中,numInt变量被定义为int类型;接下来是*ptInt,它也是int类型的,只不过*符号说明这是一个指针,而指针所指向的位置保存的数据是int类型的,即ptInt是一个int指针类型的变量。

那么,ptInt指向的位置是哪儿呢?代码中的&numInt为我们提供了线索,其中的&符号称寻址运算符,&numInt表示获取numInt变量在内存中的地址,而ptInt指向的就是这个地址。

这个地址在哪?大概就是内存中的某个位置吧,我们可以使用如下代码看一下。

    NSLog(@"%Li", &numInt);

在代码中,我们几乎不会直接使用这个内存地址,而总是通过指针来操作地址中的数据。下面的代码,会显示numInt变量的值,包括使用指针来访问它。

    NSLog(@"%i", numInt);
    NSLog(@"%i", *ptInt);

在这里,我们再次使用了*运算符,它称为间接访问运算符,通过它可以获取指针所指向的内存区域中的数据。

通过上面的操作,我们应该知道ptInt指针指向的就是numInt变量的位置,那么,我们修改其中一个的数据会怎么样呢?下面的代码就演示了这些操作。

    int numInt = 99;
    int *ptInt = &numInt;
    NSLog(@"%i\n", numInt);
    NSLog(@"%i\n", *ptInt);
    //
    numInt = 10;
    NSLog(@"%i\n", numInt);
    NSLog(@"%i\n", *ptInt);

我们可以看到,修改其中一个变量的值后,两个变量获取的值都会变化,这说明它们真的是相同位置的数据。

此外,如果我们需要断开指针与内存位置的关系,可以将指针设置为空指针,可以将指针变量设置为NULL值或nil值,如ptInt = NULL。不过应注意,玩失联在很多时候并不是令人愉快的事情。