iOS 指针详解

  1. 指针数组数组指针
    在这里数组指针是指向数组的指针,其本质为指针,指向的对象是数组。由于数组的形式多样所以数组指针的表达也十分多样。同理,指针数组就是存放指针的数组,其本质为数组。由于[ ]的优先级高于*的优先级,指针数组数组指针的表达可做如下表示:
    1
    2
    int * p1 [10];  // 指针数组  p1先与“[ ]”结合构成一个包含10个元素的数组,int*表示的则是数组的内容
    int (* p2)[10];  // 数组指针  p2先与“ * ”构成指针定义,int表示数组内容,[10]表示数组内元素个数
  • 由于指向数组的指针指向普通整型变量的指针不同,在这里可以再对数组名&数组名的关系进行理解
    在一维数组中,数组名表示指向首元素的首地址,是一个指向普通变量的指针常量,当对其+1时偏移量是一个普通数据类型的内存大小。而在数组名前加上取地址符&后,表示的就是一个指向数组的指针常量,对其+1时偏移量是一个数组的内存大小

  • int p; //这是一个普通的整型变量

  • int *p; //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int型,所以P是一个返回整型数据的指针
  • int p[3]; //首先从P处开始,先与[]结合,说明P是一个数组,然后与int结合,说明数组里的元素是整型的,所以P是一个由整型数据组成的数组
  • int *p[3]; //首先从P处开始,先与[]结合,因为其优先级比*高,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int结合,说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组
  • int (*p)[3]; //首先从P处开始,先与*结合,说明P是一个指针,然后再与[]结合,说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整型的,所以P是一个指向由整型数据组成的数组的指针
  1. 可以通过如下题目,进一步理解上面的讲解
    1
    2
    3
    int arrayName[4] = {10, 20, 30, 40};
    int *p = (int *)(&arrayName + 1);
    NSLog(@"%d", *(p - 1));
  • 答案解析
    1. (&arrayName + 1)&arrayName是数组的地址(等价于指向arrayName数组的指针
    2. 增加1会往后移动16个字节,开始是4个字节的位置,移动后就是16个字节后面的位置(也就是目前位置是20个字节
    3. 最后又赋值给int类型的指针pint类型占4个字节
    4. 所以(p - 1)就是减去4个字节,变成为16个字节的位置,输出的*(p - 1)值为40
-------------本文结束感谢您的阅读-------------
最近的文章

Mac OS 安装与恢复

通过 macOS 恢复功能启动要通过 macOS 恢复功能启动,请开启 Mac 并立即按住键盘上的以下组合键之一。通常建议您使用 Command-R-电源键 Command (⌘)-R-电源键安装您的 Mac 上装有的最新 macOS Option-⌘-R-电源键升级到与您的 Mac 兼容的最 …

继续阅读
更早的文章

iOS KVO

KVO和NSNotificationCenter都是iOS中观察者模式的一种实现。区别在于,相对于被观察者和观察者之间的关系,KVO是一对一的,而NSNotificationCenter是一对多的。KVO对被监听对象无侵入性,不需要修改其内部代码即可实现监听。 KVO底层实现KVO是基于runti …

继续阅读