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. [Nlog]使用经验

    <?xml version="1.0" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog ...

  2. TCL列表

    列表是Tcl的基本可用数据类型之一.它是用于表示项目的有序集合.它可以包括不同类型的在同一列表的项目.此外,一个列表可以包含另一个列表. 需要注意的一个重要的事情是,列表表示为完全串并处理在需要时,形 ...

  3. c#中的可选参数和命名参数的使用

    C#4.0之后出现了一个可选参数这个特性. class Cal { static void Main(string[] args) { test1 t = new test1(); t.Add(, ) ...

  4. 【洛谷】P1247 取火柴游戏(Nim)

    题目 传送门:QWQ 分析 蒟蒻根本不会博弈论..... 只知道异或和判断Nim游戏.. 不是很懂输出的选择,所以发一篇博客以待复习 代码 #include <bits/stdc++.h> ...

  5. canvas合成和裁剪

    canvas合成和裁剪 属性 globalCompositeOperation=type 设置覆盖类型 source-over 源覆盖在目标上 source-in 源覆盖在目标上的公共部分(只取源图形 ...

  6. 深入浅出 Java Concurrency (6): 锁机制 part 1 Lock与ReentrantLock

      前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明.从这一章开始花少量的篇幅谈谈锁机制. 上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念 ...

  7. QT error LNK2019: 无法解析的外部符号

    一个见到那的错误,困扰了好几天了,今天才解决,记录下. 使用QT Creator建立项目,添加一个QT设计界面widget,命名为TestWidget.有ui,头文件(.h),源码文件(.cpp).在 ...

  8. Vim中nerdtree配置

    nerdtree nerdtree,就是一个文件树目录. 配置脚本 "文件树 Plug 'scrooloose/nerdtree' Plug 'Xuyuanp/nerdtree-git-pl ...

  9. 集合工具类CollectionUtils、ListUtils、SetUtils、MapUtils的使用

    主要用它的isEmpty(final Collection<?> coll)静态方法来判断一个给定的集合是否为null或者是否长度为0.最近才发现此工具类还可以取集合的交集.并集.甚至差集 ...

  10. Yii中利用filters来控制访问

    filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下: public function filters() { // retur ...