C++ const与指针之间组合的辨析

    xiaoxiao2021-03-25  122

    const与指针之间相互组合的辨析

    1:如果一个对象被声明为const,变成了常量那么也只能使用指向常量的指针来存放常量的地址。但是,指向常量的指针并没有规定其所指对象必须为常量。所以,指向常量的指针仅仅要求不能通过该指针改变对象的值,使用其他方式改变对象的值是被允许的!

    #include<iostream> #include<vector> #include<map> using namespace std; int main(int argc, char**argv) { const int a1 = 0;//常量必须进行初始化 int *p1 = &a1;//错误,存放常量的地址必须是常量指针 const int *p2 = &a1;//正确,常量指针,存放a1的地址 //指向常量的指针并没有规定其所指对象必须为常量 int a2 = 1; const int *p3 = &a2; a2 = 3;//可以改变非常量对象的值 *p3 = 4;//错误,不可以通过指向常量的指针修改对象的值 return 0; } 2:当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量,对应底层const;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量,对应顶层const。

    const int *p1 = &a1;//常量指针 int const *p3 = &a1;//两者相同

    3:常量指针:不能通过常量指针修改它所指向的内容(注意其他合法方式是被允许的!!!)

    指针常量:指针本身不可再指向其他地方(此时修改指针所指向的对象完全依赖于该对象的类型,如果指向对象非常量,可以通过指针来修改)

    #include<iostream> #include<vector> #include<map> using namespace std; int main(int argc, char**argv) { const int a1 = 0; int a2 = 1; const int *p1 = &a1;//常量指针 int *const p2 = &a2;//指针常量 *p2 = 3;//可以进行修改 const int *const p3 = a1;//指针本身不可变且不能通过指针改变指向对象的值 return 0; }

    4:加上括号之后的情况:const (char *) p1; 因为char *是一个整体,相当于一个类型(如 char),因此,这是限定指针是const。

    Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to ) cp is a const pointer to char :cp是一个指向字符型的常量指针,指针不能改变; const char * p; p is a pointer to const char:cp是一个指向字符型常量的指针,指针指向的值不能随便改变(可否改变要依赖于该值的类型); char const * p; 同上。

    最好的方法:从右向左读,解引用符号*左边当作一个整体

    const char * const & cp;// cp首先是一个引用,const pointer to const char ,一个指向const char的const指针的引用

    转载请注明原文地址: https://ju.6miu.com/read-6549.html

    最新回复(0)