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;
    }
    
    当上面的代码被编译和执行时,它产生的结果如下:
    
    2020-08-07 16:57:22.253 test[3260:14212] Address of var1 variable: 61fef8
    2020-08-07 16:57:22.268 test[3260:14212] Address of var2 variable: 61feee
    
    因此,您了解了什么是内存地址以及如何访问它,因此该概念的基础已经结束。现在让我们看看什么是指针。
  • 什么是指针

    指针是一个变量,其值是另一个变量的地址,即存储位置的直接地址。像任何变量或常量一样,必须先声明一个指针,然后才能使用它存储任何变量地址。指针变量声明的一般形式是-
    
    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类型变量 */
       int  *ip;         /* 定义一个int类型的指针 */  
       ip = &var;       /* 把var变量的地址赋值给指针ip */
    
       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;
    }
    
    当上面的代码被编译和执行时,它产生的结果如下:
    
    2020-08-20 03:20:21.873 test[24179] Address of var variable: 337ed41c
    2020-08-20 03:20:21.873 test[24179] Address stored in ip variable: 337ed41c
    2020-08-20 03:20:21.874 test[24179] Value of *ip variable: 20
    
  • NULL 指针

    在没有确切地址要分配的情况下,将NULL值分配给指针变量始终是一个好习惯。这是在变量声明时完成的。分配了NULL的指针称为空指针。 NULL指针是在几个标准库中定义的值为零的常量。考虑以下程序-
    
    #import ≪Foundation/Foundation.h>
    
    int main () {
       int  *ptr = NULL;
       NSLog(@"The value of ptr is : %x\n", ptr  );
       return 0;
    }
    
    当上面的代码被编译和执行时,它产生的结果如下:
    
    2020-08-10 03:21:19.447 test[28027] The value of ptr is : 0
    
    在大多数操作系统上,不允许程序访问地址0处的内存,因为该内存是由操作系统保留的。但是,存储器地址0具有特殊的意义。它指示指针不旨在指向可访问的存储位置。但是按照惯例,如果指针包含空(零)值,则假定该指针不指向任何内容。要检查空指针,可以使用以下if语句-
    
    if(ptr)     /* succeeds if p is not null */
    if(!ptr)    /* succeeds if p is null */