【oc】指针
来源:互联网 发布:知乎2016 编辑:程序博客网 时间:2024/05/20 18:40
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】指针
- OC self指针
- oc的指针是什么
- OC 强弱指针学习心得
- 浅谈OC中的指针
- OC指针小计
- oc的指针是什么
- 智能指针 与 oc中的指针
- OC之【指向指针的指针】
- OC id指针 和 isa指针
- oc-空指针和野指针
- OC 空指针和野指针
- [OC]对象、指针/方法、函数
- OC 中数组和指针
- OC-7-释放池,指针
- OC-底层实现isa指针
- OC基础-id指针18
- OC语言—Id万能指针
- 引用形参使用中要注意的问题
- 多核程序设计——缓存一致性协议MESI
- 流程控制和类型转换
- hdu 3496 Watch The Movie
- 数据结构(一)顺序表、链表以及队列
- 【oc】指针
- Java学习----继承和接口的区别是什么???
- Algorithms—107.Binary Tree Level Order Traversal II
- Ubuntu jdk报Picked up JAVA_TOOL_OPTIONS信息解决
- getLaunchIntentForPackage 获取到的为null原因
- Eclipse在线安装SVN
- POJ 动态规划专题
- c_基本概念
- Codeforces Round #275(Div2) B.Friends and Presents 二分+数学