Objective-C 指针

Objective-C 中的指针学习起来既简单又有趣。 某些 Objective-C 编程任务使用指针更容易执行,而其他任务(例如动态内存分配)如果不使用指针则无法执行。 因此,要成为一名完美的 Objective-C 程序员,学习指针就变得很有必要了。 让我们通过简单易行的步骤开始学习它们。

如您所知,每个变量都是一个内存位置,每个内存位置都有其定义的地址,可以使用与号 (&) 运算符访问该地址,表示内存中的地址。 考虑以下示例,它将打印定义的变量的地址 −

#import <Foundation/Foundation.h>

int main () {
   int  var1;
   char var2[10];

   NSLog(@"Address of var1 variable: %x\n", &var1 );
   NSLog(@"Address of var2 variable: %x\n", &var2 );

   return 0;
}

当上面的代码被编译和执行时,它产生的结果如下 −

2013-09-13 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
2013-09-13 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

那么,您了解什么是内存地址以及如何访问它,概念的基础就结束了。 现在让我们看看什么是指针。


什么是指针?

指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。 与任何变量或常量一样,您必须先声明一个指针,然后才能使用它来存储任何变量地址。 指针变量声明的一般形式是 −

type *var-name;

这里,type是指针的基类型; 它必须是有效的 Objective-C 数据类型并且 var-name 是指针变量的名称。用于声明指针的星号 * 与用于乘法的星号是同一个星号。 但是,在此语句中,星号用于将变量指定为指针。 以下是有效的指针声明 −

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

所有指针的值的实际数据类型,无论是整型、浮点型、字符型还是其他,都是一样的,都是代表内存地址的长十六进制数。 不同数据类型的指针之间的唯一区别是指针指向的变量或常量的数据类型。


如何使用指针?

很少有重要的操作,我们会非常频繁地借助指针来完成。(a)我们定义一个指针变量,(b)将一个变量的地址赋给一个指针,(c)最后访问 指针变量中可用地址处的值。这是通过使用一元运算符 * 完成的,该运算符返回位于其操作数指定地址的变量值。 以下示例使用了这些操作 −

#import <Foundation/Foundation.h>

int main () {
   int  var = 20;    /* 实际变量声明 */
   int  *ip;         /* 指针变量声明 */  
   ip = &var;       /* 在指针变量中存储 var 的地址*/

   NSLog(@"Address of var variable: %x\n", &var  );

   /* 存储在指针变量中的地址 */
   NSLog(@"Address stored in ip variable: %x\n", ip );

   /* 使用指针访问值 */
   NSLog(@"Value of *ip variable: %d\n", *ip );

   return 0;
}

当上面的代码被编译和执行时,它产生的结果如下 −

2013-09-13 03:20:21.873 demo[24179] Address of var variable: 337ed41c
2013-09-13 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
2013-09-13 03:20:21.874 demo[24179] Value of *ip variable: 20

Objective-C 中的 NULL 指针

如果您没有要分配的确切地址,最好将 NULL 值分配给指针变量。 这是在变量声明时完成的。 分配为 NULL 的指针称为 null 指针。

NULL 指针是在多个标准库中定义的值为零的常量。 考虑以下程序 −

#import <Foundation/Foundation.h>

int main () {
   int  *ptr = NULL;
   NSLog(@"The value of ptr is : %x\n", ptr  );
   return 0;
}

当上面的代码被编译和执行时,会产生如下结果 −

2013-09-13 03:21:19.447 demo[28027] The value of ptr is : 0

在大多数操作系统上,程序不允许访问地址 0 处的内存,因为该内存由操作系统保留。 但是,内存地址0有特殊的意义; 它表示指针并非旨在指向可访问的内存位置。 但按照惯例,如果指针包含 null(零)值,则假定它没有指向任何内容。

要检查空指针,可以使用如下 if 语句 −

if(ptr)     /* 如果 p 不为 null,则成功 */
if(!ptr)    /* 如果 p 为 null,则成功 */

详细的 Objective-C 指针

指针有许多简单的概念,它们对 Objective-C 编程非常重要。 以下是一些重要的指针概念,对于 Objective-C 程序员来说应该很清楚 −

序号 概念 & 描述
1 Objective-C - 指针运算

有四种算术运算符可用于指针: ++, --, +, -

2 Objective-C - 指针数组

您可以定义数组来保存多个指针。

3 Objective-C - 指向指针的指针

Objective-C 允许您在指针上设置指针等等。

4 将指针传递给 Objective-C 中的函数

通过引用或地址传递参数都可以使被调用函数在调用函数中更改传递的参数。

5 从 Objective-C 中的函数返回指针

Objective-C 允许函数返回指向局部变量、静态变量和动态分配内存的指针。