Objective-C 指针

每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问。

a. 我们定义一个指针变量

b. 分配一个指针变量的地址

c. 最后访问提供的地址指针变量的值。这是通过使用一元运算符*返回值的变量,其操作数位于指定的地址。

实例:

 #import <Foundation/Foundation.h>

 int main ()
{
int var = ; /* actual variable declaration */
int *ip; /* yiibaier variable declaration */ ip = &var; /* store address of var in yiibaier variable*/
 
NSLog(@"Address of var variable: %x", &var );              //Address of var variable: 337ed41c /* address stored in yiibaier variable */
NSLog(@"Address stored in ip variable: %x", ip );            //Address stored in ip variable: 337ed41c /* access the value using the yiibaier */
NSLog(@"Value of *ip variable: %d", *ip );                //Value of *ip variable: 20 return ;
}

解惑:

  • ip = &var      取地址        →         *ip = var      取值
  • 如果指针指向NULL,地址为0

指针的算术运算

ptr是一个整数的指针,它指向的地址1000,假设32位的整数,执行  ptr++  操作后,指针将指向 1004 位置

因为每次指针递增,它会指向到下一个整数的位置,这是到当前位置的下一个4个字节。此操作将指针移动到下一个内存位置,而不会影响实际值的内存位置。如果ptr指向一个字符的地址是1000,那么上面的操作将指向下一个字符的位置1001

指针递增运算

 #import <Foundation/Foundation.h>

 const int MAX = ;

 int main ()
{
int var[] = {, , };
int i, *ptr; /* let us have array address in yiibaier */
ptr = var;
for ( i = ; i < MAX; i++)
{
NSLog(@"Address of var[%d] = %x", i, ptr );
NSLog(@"Value of var[%d] = %d", i, *ptr ); /* move to the next location */
ptr++;
}
return ;
}

产生结果如下:

Address of var[] = 7e6f2a70
Value of var[] =
Address of var[] = 7e6f2a74
Value of var[] =
Address of var[] = 7e6f2a78
Value of var[] =

指向指针的指针

实例:

 #import <Foundation/Foundation.h>

 int main ()
{
int var;
int *ptr;
int **pptr; var = ; /* take the address of var */
ptr = &var; /* take the address of ptr using address of operator & */
pptr = &ptr; /* take the value using pptr */
NSLog(@"Value of var = %d", var );
NSLog(@"Value available at *ptr = %d", *ptr );
NSLog(@"Value available at **pptr = %d", **pptr); return ;
}

产生结果如下:

Value of var =
Value available at *ptr =
Value available at **pptr =

解惑:

  • var = 3000 , ptr = &var , pptr = &ptr = &&var
  • *ptr = var , *pptr = ptr , **pptr = *ptr = var = 3000

参考资料:

[1] 易百教程 Objective-C 指针

[2] 易百教程 Objective-C 指针运算

[3] 易百教程 Objective-C 指向指针的指针

Objective-C 学习笔记(五) 指针的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  9. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

随机推荐

  1. IDEA中修改各个部位的字体大小

    1.菜单栏 Setting -> Appearance&Behavior -> Appearance ->Override default fonts by (not rec ...

  2. [转]oracle 12c 中的分页子句

    转自:http://blog.itpub.net/271063/viewspace-1061279/ -- 连接数据库 创建测试用户-- Connected to Oracle Database 12 ...

  3. 熟练的使用CIFAR-10数据集

    CIFIR-10是一套包含60000张,大小为32x32的十分类图片数据集,其中50000张被分为训练数据,10000张被分为测试数据,http://www.cs.toronto.edu/~kriz/ ...

  4. 巧用c++11 的forward实现可变参数构造,生成智能指针

    C++11 提供强大的智能指针shared_ptr来管理内存,避免使用裸指针带来的各种不确定访问造成的程序崩溃. 为了强制使用智能指针,一个简单的办法是,将类的构造函数析构函数声明为protected ...

  5. js 各种距离

    网页可见区域宽  document.body.clientWidth  网页可见区域高  document.body.clientHeight  网页可见区域宽(包括边线的宽)  document.b ...

  6. 个人tools封装

    /** * jQuery 扩展 */(function ($) { $.fn.extend({ /** * 目标为任意对象元素 * 同时绑定单击和双击事件 */ bindClick: function ...

  7. tomcat与jboss 01

    1. Tomcat是Apache鼎力支持的Java Web应用服务器(注:servlet容器),由于它优秀的稳定性以及丰富的文档资料,广泛的使用人群,从而在开源领域受到最广泛的青睐. 2. Jboss ...

  8. 【转】从Mac/OS和iOS开放源码浅谈UNIX家谱

    阅读数:1245 苹果公司在各类开源项目中长期贡献着自己的力量,但其UNIX系统技术一直都属于闭源阵营(这一点可以从NUX OS阵营和家谱图中得到答案).然而,以封闭闻名的苹果公司,2017年国庆期间 ...

  9. 编程语言分类和Python解释器介绍

    主要内容: 一.编程语言分类和介绍 二.Python解释器分类和介绍 一.编程语言分类和介绍 1.编程语言分类 编程语言的发展依次经历了机器语言.汇编语言和高级语言. 2.编程语言的介绍   2.1 ...

  10. python传值&值引用

    [python传值&值引用] 和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值 ...