1.取一个变量的值,可通过直接与间接的方式

直接:访问变量  

间接:通过变量的内存地址来获取变量的值。

存放内存地址的变量就是指针变量。

2.定义指针变量的语法:类型* 变量名

&:取地址运算符,取变量的内存地址;(单目运算符)

*:取变量运算符,读取指针所指的变量。

3.对于指针变量,有两个规则:

(1)定义指针变量时,必须用*来标识定义指针变量;

(2)c语言是强类型语言,指针变量需要先定义再使用,而且一旦指定指针的类型,则该指针变量只能指向指定类型的变量。

4.指针可作为函数形参:

#import<Foundation/Foundation.h>

  void swap(int* a,int* b)

{

   int tmp=*a;

    *a=*b;

    *b=tmp

a=b=nil;

}

int main(int argc,char* argv[])

{

@autoreleasepool{

  int m=5;

  int n=9;

  //m,n的值发生对调

  //如果函数参数使用普通变量,m,n的值不受函数的影响

  swap(m,n);

   NSLog(@"%d,%d",m,n);

}

return 0;

}

原因:因为函数传递方式是值传递,直接使用变量的副本。如果函数变量是普通变量,那么函数对变量所做的修改都无法改变变量本身。

   如果函数需要对变量的值进行修改,则需要传入该函数的指针,并在函数中对指针所指的变量值进行修改。

以函数swap(a,b)为例:

指针*a 指向m,取m的值(m=5)赋给tmp,而tmp又将值赋给了指针*b,指针*b代表了n的内存地址,从而改变了n的值(地址传递);

如果形参是普通变量:因为是值传递,使用的是m,n的副本,所以只是单纯的把m,n复制一份给a,b;a,b怎么变都不会来影响m,n。

5.指针与数组

(1)数组的首地址就是数组的地址。

  int arr[];

  &arr[0]=&arr[];

  不能将整数值直接赋值给指针变量。

(2)指针的赋值方式

  int* p;int* pt;int a;

  p=&a;//将a的内存地址赋给p;

  p=&arr[i];//将数组中的某个元素地址赋给p;  

  p=arr;//将数组的首地址赋给p;

  p=pt;//将pt保存的内存地址赋给p;

(3)数组指针的运算

  加减一个整数n:指针的地址加减(n*变量大小个字节);

  当两个指针指向同一个数组时,两指针相减表示 所指的两个数组元素之间相隔的元素个数;

  当两个指针指向同一个数组时,指向前面元素的指针小于指向后面的。

(4)数组变量是指针常量,因为数组地址是不可变的。

6.数组变量作为函数参数:

传入的是指向数值的指针,在函数中对数组元素所做的修改将会影响到原来的数组。

快速排序法:

//

7.字符串与指针

c语言中 用字符数组表示 字符串,所以字符串指针就是指向字符数组首地址的数组指针。

字符串(字符数组),字符指针(指向字符数组的指针)

ps:需要把指针定义成字符型指针。

  字符数组不能重新赋值,只能在定义时赋值;

8.函数与指针

指针也可以表示函数入口

指针指向函数入口步骤:

(1)定义函数指针变量:

   语法:(函数返回值类型*)(函数指针变量名)()

(2)将函数赋值给指针变量:

(3)使用函数指针变量调用函数:

   语法:(*函数指针变量名)(参数);

函数指针作为另一个函数参数:

定义一个函数时,但某些处理逻辑没有确定下来,即部分代码需要动态改变时,可使用函数指针作为参数。

函数指针作为返回类型:

为了保证返回的指针有效,有两种方式:

(1)指向函数中的局部变量时,使用static关键字;

(2)让指针指向暂时不会释放的数据。

9.指针数组

声明指针数组的格式:数据类型 *数组变量名[长度]

注意:类型(* 数组变量)[长度]:表示指向一位数组的指针.

【学习笔记】【oc】指针的更多相关文章

  1. iOS学习笔记---oc语言第一天

    第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++  java   ...

  2. iOS学习笔记---oc语言第三天

    继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量 ...

  3. iOS学习笔记--OC系列(1)

    前言 从学校毕业进入公司工作已经第3个年头了,回顾这3年的经历,有种迷茫的感觉.在公司我主要是做零售业公司的系统维护,接触的主要是Oracle的Database的东西.但是业务知识和oracle,都没 ...

  4. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...

  5. c++学习笔记——智能指针

    智能指针是为了便于管理动态内存,能够自动管理释放所指向的对象. 智能指针共有三种:1.shared_ptr允许多个指针指向同一个对象:2.unique_ptr独占所指向的对象:3.weak_ptr是一 ...

  6. iOS学习笔记---oc语言第十天

    内存管理高级 一 属性的内部实现原理   assign   retain    copy assign 下的属性内部实现 setter方法 @property(nonatomic,assign)NSS ...

  7. iOS学习笔记---oc语言第九天

    初级内存管理 iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现 内存问题体现在两个方面:内存溢出\野指针异常 内存溢出:程序运行超出内存上限 野指针异 ...

  8. iOS学习笔记---oc语言第六天

    Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语⾔中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函 ...

  9. iOS学习笔记---oc语言第五天

    字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...

  10. iOS学习笔记---oc语言第四天

    字符串 数组 一.使用苹果帮助文档 学会使⽤用苹果帮助⽂文档是开发者的⼀一项技能 Inherits from 继承⾃自 Conforms to 遵循什么协议 Framework 属于哪个框架 Avai ...

随机推荐

  1. JavaScript 函数绑定 Function.prototype.bind

    ECMAScript Edition5 IE9+支持原生,作用为将一个对象的方法绑定到另一个对象上执行. Function.prototype.bind = Function.prototype.bi ...

  2. windows路由命令route

    route print 查看当前的路由信息 route add 10.0.0.0 mask 255.0.0.0 10.1.1.1 增加一条到10.0.0.0/8网络的路由,网关是10.1.1.1 ro ...

  3. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  4. autoIT 自动化上传/下载文件图文详解【python selenium】

    情景: 在用selenium进行web页面自动化时,时不时会遇到上传附件的情况,常见的情况就是一个上传按钮,点击后弹出windows窗口,选择文件后上传,如下图1所示 图1 这种情况超出了seleni ...

  5. Solaris下怎样改动文件创建时间及查询

    Solaris下怎样改动文件创建时间及查询 实验演示: 1.核对时间 [root@S1011:/]# date Tue Jul 15 21:37:01 CDT 2014 --若时间不对请先按例如以下格 ...

  6. 利用NIO建立Socket服务器

    传统的Java 的IO,利用Socket建立服务器,接收客户端连接,一般都是为每一个连接建立一个线程,如果连接数巨大,那么服务器开销也将巨大..NIO的原理,可以参照图:http://new.51ct ...

  7. 解决PyGObject在pydev下报错的问题

    使用PyGObject在eclispe+pydev下写代码,由于库是动态链接的,pydev无法识别,所以检查语法的时候会报错,但是并不影响代码运行. 不过对于我这样由轻微强迫症的患者来说,看见代码报错 ...

  8. 基于redis 内存数据库简单使用

    在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...

  9. Linux驱动程序开发 - 设备控制接口

    (2008-08-08 15:02:19) 转载▼ 标签: it linux kernel driver 分类: Linux 序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管 ...

  10. Jquery小东西收集

    1. $(document).ready(),$(function(){}),$(window).load(),window.onload的关系与区别 $(document).ready(functi ...