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. mysql 5.6.15升级到5.6.43

    今天闲来无事,观察测试环境的zabbix服务器,发现内存泄漏严重,于是重启了,想起了前几天写的帖子发生了严重的内存泄漏可以把mysql升级到最新的小版本 于是乎就试着升级 old version:5. ...

  2. C# 之 日常问题积累

    https://www.cnblogs.com/xinaixia/p/3956349.html

  3. window.btoa()方法;使字符编码成base64的形式

    atob() 函数能够   解码  通过base-64编码的字符串数据.相反地, btoa() 函数能够从二进制数据“字符串” 创建 一个base-64编码的ASCII字符串.

  4. Vue-cli webpack模板

    Vue webpack项目开始构建模板使用,关键内容摘要 中文文档 https://loulanyijian.github.io/vue-cli-doc-Chinese/ 官方英文 http://vu ...

  5. MyBatis 查询缓存

    增删改操作对一级缓存的影响:增删改操作都会清空一级缓存,无论是否提交

  6. Ubuntu下用devstack单节点部署Openstack

    一.实验环境 本实验是在Vmware Workstation下创建的单台Ubuntu服务器版系统中,利用devstack部署的Openstack Pike版. 宿主机:win10 1803  8G内存 ...

  7. shell编程变量赋值

    [shell编程变量赋值] 1.等号两边均不能有空格存在.例, a="hello world"   2.变量和其它文字以{}或空格格开,否则会混淆.例, 有时候变量名可能会和其它文 ...

  8. 安装 ORACLE 11G出现Error Message:PRVF-7535

    Error Message:PRVF-7535 : Proper architectureis not found on node "tsing" [Expected = &quo ...

  9. 无法启动Tomcat, 端口被占用的问题

    这个错误是说这几个端口已经有某个应用程序占用了,所以Tomcat就没法启动了.   出现这个问题的原因可能有以下几种: 情况一:点击运行的时候没有选中页面或Servlet窗口的标签 标签被选中时: 标 ...

  10. 12. Integer to Roman (HashTable)

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...