指针常量&常量指针&指向常量的指针常量
搞不懂不吃晚饭😊
(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指针来改变实参的内容。