指针总结

什么是指针:
类型 定义指针变量 整数 内存编号
为什么使用指针:
1、共享变量、输出参数
2、提高传参效率
3、使用堆内存(无法取名)
如何使用指针:
定义:类型变量名_p;
变量名以p结尾,用于与普通变量加以区分
一个
只能定义一个指针变量
类型决定了该指针能够访问多少个字节
初始值不确定,必须初始化为NULL
赋值:变量名_p = 地址;
地址必须是有效且有意义的,如果无效无意义,在赋值时也不会报错
栈内存:int* p = #
堆内存:int* p = malloc(n);
也可以在定义时直接赋值
解引用:变量名_p; 《=》 num
通过指针变量中存储的内存编号去访问内存
该过程可能产生段错误,是由于赋值了非法内存造成的
使用指针需要注意的问题:
空指针:值为NULL都是空指针
对空指针进行解引用就会产生段错误,对任何的来历不明的指针解引用前先判断
作为函数的返回值或者函数的参数
空指针也作为错误标志,如果函数的返回值是NULL,表示函数执行出错
野指针:值是不确定的指针
对野指针解引用后果:段错误、脏数据、一切正常
野指针比空指针危害性更大,因为无法辨别,而且还可能隐藏错误。
如果不产生野指针:
1、定义指针变量时,一定要初始化
2、函数不要返回局部变量的地址
3、当指针指向的内存被销毁时,要及时把指针变量置空,赋值为NULL
指针的运算:
指针的运算只有以下运算才是有意义的:
指针+n :前进n个元素
指针-n :后退n个元素
指针-指针:计算两个指针之间相隔了多少个元素,必须相同类型的指针才能相减
指针与const:
const int
p; 保护内存的数据不被修改
int const p; 同上
int
const p; 保护指针变量不被修改
const int* const p; 保护内存数据、指针变量都不被修改
int const* const p; 同上
指针数组与数组指针:
指针数组:成员都是指针的数组
int* arr[10];
数组指针:专门指向数组的指针
int (arrp)[10];
数组名与指针的区别:
数组名就是数组的首地址,它与数组地址的关系是映射关系,相当于是一个特殊的指针,是常量,不能修改。
数组当做函数的参数传递时就蜕变成了指针,长度丢失了,需要额外传递长度的参数
数组名也可以解引用,指针也可以使用中括号,数组名也可以当做指针使用,指针也可以当做数组名使用。(指针指向数组的首地址)
数组名与内存是映射关系,指针与内存是指向关系
二级指针:
二级指针就是指向指针的指针,用于存储指针变量的地址
定义:int
* 变量名_pp;
赋值:变量名_pp = &指针变量;
解引用: *变量名_pp <=> 指针变量
**变量名_pp <=> *指针变量
函数指针:
函数名就是函数在代码段内的首地址,函数指针用于指向该函数的指针。
调用函数指针其实就是跳转到该函数所在代码段中,执行其中的二进制指令代码
定义:
返回值类型 (*指针变量名)(类型1 变量名1,…);
赋值:
函数指针变量名 = 函数名;
使用;
函数指针(实参)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值