Objective-C 指针

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

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

  1. #import <Foundation/Foundation.h>
  2. int main () {
  3. int var1;
  4. char var2[10];
  5. NSLog(@"Address of var1 variable: %x\n", &var1 );
  6. NSLog(@"Address of var2 variable: %x\n", &var2 );
  7. return 0;
  8. }

结果如下:

  1. 2022-07-07 03:18:45.727 demo[17552] Address of var1 variable: 1c0843fc
  2. 2022-07-07 03:18:45.728 demo[17552] Address of var2 variable: 1c0843f0

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


什么是指针?

指针 是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,在使用指针存储任何变量地址之前,必须先声明指针。指针变量声明的一般形式是:

  1. type *var-name;

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

  1. int *ip; /* 指向整型的指针 */
  2. double *dp; /* 指向双精度型的指针 */
  3. float *fp; /* 指向浮点型的指针 */
  4. char *ch /* 指向字符的指针 */

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


如何使用指针?

我们将经常借助指针来完成一些重要操作。(a) 我们定义一个指针变量,(b) 将变量的地址分配给指针,以及 (c) 最终访问指针变量中可用地址处的值。这是通过使用一元运算符 * 实现的,该运算符返回位于其操作数指定地址的变量值。比如下面的实例:

  1. #import <Foundation/Foundation.h>
  2. int main () {
  3. int var = 20; /* actual variable declaration */
  4. int *ip; /* pointer variable declaration */
  5. ip = &var; /* store address of var in pointer variable*/
  6. NSLog(@"Address of var variable: %x\n", &var );
  7. /* address stored in pointer variable */
  8. NSLog(@"Address stored in ip variable: %x\n", ip );
  9. /* access the value using the pointer */
  10. NSLog(@"Value of *ip variable: %d\n", *ip );
  11. return 0;
  12. }

结果如下:

  1. 2022-07-07 03:20:21.873 demo[24179] Address of var variable: 337ed41c
  2. 2022-07-07 03:20:21.873 demo[24179] Address stored in ip variable: 337ed41c
  3. 2022-07-07 03:20:21.874 demo[24179] Value of *ip variable: 20

Objective-C 中的空(NULL)指针

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

空指针是在几个标准库中定义的值为 0 的常量。参考下面的实例:

  1. #import <Foundation/Foundation.h>
  2. int main () {
  3. int *ptr = NULL;
  4. NSLog(@"The value of ptr is : %x\n", ptr );
  5. return 0;
  6. }

结果如下:

  1. 2022-07-07 03:21:19.447 demo[28027] The value of ptr is : 0
在大多数操作系统上,不允许程序访问地址 0 处的内存,因为该内存由操作系统保留。然而,存储器地址 0 具有特殊意义;它表示指针不打算指向可访问的内存位置。但按照惯例,如果指针包含空(0)值,则假定指针指向 0。

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

  1. if(ptr) /* 如果 p 非空,则执行 */
  2. if(!ptr) /* 如果 p 为空,则执行 */

Objective-C 指针详细介绍

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

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

有 4 个算术运算符可用于指针: ++, —, +, -

2Objective-C - 指针数组

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

3Objective-C - 指针指向指针

Objective-C 允许您将指针指向指针上,依此类推。

4Objective-C 向函数传递指针

通过引用传递参数或通过地址传递参数,这两种方式都允许被调用函数在调用函数中更改传递的参数。

5Objective-C 从函数返回指针

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