const

来源:互联网 发布:努比亚z11mini网络 编辑:程序博客网 时间:2024/05/04 00:54

 

指针和constconst用于指针有一些很微妙的第方,指针总是看起来很微妙)我们来详细的探讨一下,

const声明常量是必须提供初始化

Const int maxsize=100;

 

可以用俩种不同的方式将const关键字用于指针,

第一种方法是将指针指向一个常量对象,这样可以防止使用指针来修改所指向的值。

第二种方法是是将指针本身声明为常量,这样可以防止指针指向的位置。下面来看细节

Int age =39

Const int *pt=&age;

该声明指出,*pt指向一个const int (这里为39)。因此不能使用pt来修改这个值。换句话说*pt的值为const,不能被修改

*pt+=1;//invalid beacase pt pintrt to constint ;

cin>>*pt///invalid for the samereason

 

现在来看一个很微妙的问题,pt的声明并不意味着他只想的值实际上就是一个常量,而是意味着对pt而言这个值就是常量,例如,pt指向age,age不是const,可以直接通过age的值来修改age的值但不能通过pt指针来修改它

*pt=20;//invalid becase pt pointer to aconst int;

Age=20;//valid becase age is not declare tobe const

可以讲常规变量的地址赋给常规指针,以上要轮的是将常规变量的地址付给指向const的指针。还有俩种可能

1:将const变量的地址赋给指向const的指针如

Const float *pe=&g_earth=9.80;constfloat *pe=&g_earth;//valid

另一种情况是将const地址赋给常规指针//这种情况不行

Const float g_moon=1.63;

Float *pe=&g_noon;//invalid

 

假设有一个const数组组成的数据

Constmonth[12]={31,28,31,30,31,31,30,31,30};

 

则禁止将常量数组的地址赋给非常量指针,将意味着不能将数组名作为参数传递给使用非常量形参的函数

Int sum(int arr(),int n)//should have beenconst int arr[]

.........

..........

int j=sum(months,12);//not allowed

上述函数调用将construction指针(month)赋给非const指针(arr),编译器将禁止这种函数的调

但若month为非const可以这样用Int sum(const int arr[],int n)

Int j=sum(month;12);

即非常指针赋给常指针

在面向对象里非常长成员函数可以调用常成员函数,但常成员函数不可以调用常成员函数

 

               进了能使用const

将指针参数声明指向常量数据的指针有俩条理由

l        这可以避免无意间修改数据而导致的编程错误

l        使用const函数接受处理const和非const实参,否则将只能接受非const数据

如果条件允许,则应将指针性灿灿指向const的指针

 

 

还有另一个微妙之处

Int age=39;

Const int *pt=&age;

第二个声明是防止pt修改39,但无法防止修改ipt的值,也就是说可以将一个新地址赋给pt;

Int sage=80;

Pt=& Sage;

但仍然不能用pt修改他指向的值(现在为80

 

 

 

 

以下使用const的方式使得指针的值无法被修改

Int sloth=3;

Const int *ps=&sloth;

Int *const finger=&sloth;

在最后的声明中,关键字的位置与以前不同。这种声明格式使得Finger只能指向sloth,但允许使用finger来修改sloth的值,中间的声明不允许ps来修改sloth的值,但允许ps指向另一个位置