指针的有效性和运算

一、指针的有效性

►指针指向一个有确定存储空间的对象(称为已知对象),则该指针是有效的。

►若一个指针不指向程序中任何已知对象,称其指向未知对象。未知对象的指针是无效的,无效的指针使用间接引用运算几乎总会导致崩溃性的异常错误。

(1)如果指针的值为0,称为0值指针,又称空指针(null pointer),空指针是无效的。

int *p=0;
*p=2; //空指针间接引用将导致程序产生严重的异常错误

(2)如果指针未经初始化,或者没有赋值,或者指针运算后指向 未知对象,那么该指针是无效的。

int *p;//未初始化的指针,系统赋予其随机数
*p=100; //错误,p为无效指针,不能间接引用

(3)一个指针曾经指向一个已知对象,在对象的内存空间释放后, 虽然该指针仍是原来的内存地址,但指针所指已是未知对象,称为 “迷途指针”(dangling pointer)。

char *p=NULL; //p是空指针,全局变量
void fun()
{
 char c; //局部变量
 p = &c; //指向局部变量c,函数调用结束后,c的空间释放,p就成了迷途指针
}
void caller()
{
 fun();
 *p=2; //p现在是迷途指针
}

二、指针的运算

指针的运算都是作用在连续存储空间(如数组)上才有意义。

(1)指针加减整数运算

int x[10], n=3 , *p=&x[5];
p+1 //指向存储空间中x[5]后面的第1个int型存储单元,即x[6]的地址
p+n //指向存储空间中x[5]后面的第n(3)个int型存储单元,即与x[5]间隔n的地址
p-1 //指向存储空间中x[5]前面的第1个int型存储单元,即x[4]的地址
p-n //指向存储空间中x[5]前面的第n(3)个int型存储单元,即与x[5]间隔n的地址

(2)指针变量自增自减运算

设p是一个指针变量,其自增自减运算包括p++、++p、p--、--p 形式。

int x[10], *p=&x[5];
p++ //p指向x[5]后面的第1个int型内存单元
++p //p指向x[5]后面的第1个int型内存单元
p-- //p指向x[5]前面的第1个int型内存单元
--p //p指向x[5]前面的第1个int型内存单元

(3)两个指针相减运算

设p1、p2是相同类型的两个指针(常量或变量),则p2-p1的结果 为两个指针之间对象的个数,如果p2的地址值大于p1结果为正,否则为负。

int x[5], *p1=&x[0],
*p2=&x[4];
int n;
n=p2-p1;//n的值为4

(4)指针的关系运算

设p1、p2是同一个指向类型的两个指针(常量或变量),则p2和 p1可以进行关系运算,用于比较这两个地址的位置关系。

int x[5], *p1=&x[0],*p2=&x[4];
p2>p1 //表达式值为真

指针的const限定

(1)一个指针变量可以指向只读型对象,称为指向const对象的指针,定义形式为:

const 指向类型 *指针变量,......;

即在指针变量定义前加const限定符,可以改变指针指向,不允许通过指针来改变所指向的const对象的值

const int a=10, b=20;
const int *p;
p=&a; //正确,p不是只读的
p=&b; //正确,p不是只读的
*p = 42; //错误,*p是只读的,不可修改对象的值
  • 把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如:
const double pi = 3.14;
double *ptr = π //错误,ptr是非const指针变量
const double *cptr=π//正确,cptr是const指针变量
  • 允许把非const对象的地址赋给指向const对象的指针;不能使用指 向const对象的指针修改指向对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。例如:
const double pi = 3.14;
const double *cptrf = π //正确
double f = 3.14; //f是double型,f是非const
cptrf = &f; //正确,允许将f的地址赋给cptrf
f=1.618; //正确,可以修改f的值
*cptrf = 10.1; //错误,不允许通过引用cptrf修改f的值

实际编程中,指向const的指针常用作函数的形参,以此确保传递 给函数的实参对象在函数中不被修改。

 (2)const指针

一个指针变量可以是只读的,称为const指针可以改变对象的值,不可以改变指针指向,定义形式为:

指向类型 * const 指针变量,......;

int a=10, b=20;
int *const pc = &a; //pc是const指针
pc = &b; //错误,pc是只读的
pc = pc; //错误,pc是只读的
pc++; //错误,pc是只读的
*pc=100; //正确,a被修改

pc是指向int型对象的const指针。 不能使pc再被赋值指向其他对象。任何企图给const指针赋值的操作都会导致编译错误。 但可通过pc间接引用修改该对象的值。

(3)指向const对象的const指针,既不能改变指针指向,也不能改变指针指向对象的值。

可以定义指向const对象的const指针,形式为:

const 指向类型 * const 指针变量,......;

const double pi = 3.14159;
const double * const cpc = π
//cpc为指向const对象的const指针

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木(。・ω・。)ノ♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值