指针常量&常量指针&指向常量的指针常量

搞不懂不吃晚饭😊

(1)指针常量

指针常量是一个常量,但是是指针修饰的。

格式:int * const p;

例如

int a, b;
int * const p = &a;//指针常量
 //分为以下两种操作
*p = 9;//操作成功
p = &b;//操作错误,指针p将一直指向a,不能再指向b

因为声明了指针常量,p代表一个指针地址,因此指针变量不允许被修改,但是指针所指向的值即*p是可以修改的。如同次指针指向一个地址,该地址不能被修改,但是地址里的内容可以被修改。

(2)常量指针

如果在定义指针变量的时候,数据类型前用const修饰,被定义的指针变量就是指向常量的指针变量,指向常量的指针变量称为常量指针。

格式:const int *p = &a;

例如

int a, b;
const int *p = &a;//常量指针
//那么分为以下两种操作
*p = 9;//操作错误,指针指向的值不能改变
p = &b;//操作成功

因为常量指针的本质是指针,指针所指向的对象的值*p不能更改,但是指针,即p是可以修改的。

小结:

A、关键要看const修饰的是谁

int const 和 const int的写法是一样的

B、指针的话看const离谁近,离谁近就修饰谁

 

int a = 9;
int b = 5;
const int *p = &a;

p = &b;//指针修改后,指针指向的值也修改

 

常量指针不能用于改变它指向的值;而指针常量在初始化后就不能改变。

常量指针

有时需要将const项目的地址传递给指针,在这种情况下,必须把指针定义为指向const项的指针。

const int SIZE = 6;
const double payRates[SIZE] = {18.55,17,45,12,85,14,97,10,35,18.98};

上述代码中,payRates是一个const double的数组,这意味着数组中每个元素都是一个const double,编译器不会允许程序员编写改变数组内容的代码,如果想要将payRates数组传递到一个指针形参中,那么这个形参必须声明为一个指向const double的指针,定义一个常量指针:const double *rates,rates形参被定义为一个指向const double的指针,const这个单词适用于rates指向的东西,而不是rates本身。

 

rates是一个指向const的指针,所以编译器不会允许程序员改变rates指向的内容,在将常量的地址传递到指针变量中时,改变量必须已定义为指向常量的指针。如果在rates形参的定义中没有使用const关键字,则会产生编译错误。

指针常量

指向const的指针指向一个常量项目,指针指向的数据不能改变,但是指针本身可以改变,因此是指向常量的指针变量。

而对于指针常量,const指针本身就是常量,一旦指针使用了某个地址进行初始化,那么他就不能指向除此地址之外的任何其他东西。

int value = 22;
int *const ptr = &value; 

 

 

在该代码中,ptr是用value变量的地址初始化的,因为ptr是一个指针常量,所以如果编写ptr指向其他任何内容的代码,都会导致编译器错误,但是如果使用ptr来改变value的内容,则不会产生错误,因为value不是常量,并且ptr也不是一个指向常量的指针。

指针常量必须使用起始值进行初始化,如果将一个指针常量用作函数形参,则该形参将使用传递进来的实参地址进行初始化,并且在函数执行时不能被修改为指向任何其他地方。以下就是一个试图违反这个规则的实例:

void setToZero(int *const ptr){
     ptr = 0;//错误,不能更改ptr的内容
}

这个函数的形参ptr是一个const指针,他不会被编译,因为在函数中不能有改变ptr内容的代码,但是ptr并不指向const,所以可以使用代码来改变ptr指向的数据。以下实例完全可以编译:

void setToZero(int *const ptr){
    *ptr = 0;
}

虽然该形参是指针常量,但是程序员可以使用不同的实参多次调用函数,以下的代码可以成功将x、y、z的地址传递给setToZero函数:

int x,y,z;
setToZero(&x);
setToZero(&y);
setToZero(&z);

指向常量的指针常量

int value;
const int *const ptr = &value;

以上代码中,ptr是一个指向const int的const指针。

 

ptr是用value的地址初始化的,因为ptr是一个指针常量,所以不能编写使ptr指向其他任何东西的代码,又因为ptr是一个常量指针,所以也不能用它来改变value的任何内容。

以下代码显示了一个指向常量的指针常量的另一实例:

void displayValues(const int *const numbers, int size){
    for(int count = 0;count < size;count++){
    cout << *(numbers + count) << " ";
     }
    cout << endl;
}

在这段代码中,形参numbers是一个指向const int的const指针,虽然可以使用不同的实参来调用函数,但是函数本身不能改变numbers指针的指向,也不能使用numbers指针来改变实参的内容。

 

posted @ 2020-11-11 00:39  我是球啊  阅读(955)  评论(0编辑  收藏  举报