const与指针

来源:互联网 发布:union安卓图像软件 编辑:程序博客网 时间:2024/06/10 21:43

在C/C++中,const与指针之间的不同的位置关系代表着不同的意义。
本文主要对这种关系进行一次梳理,给出两种容易理解和记忆的判别方法。
1. 一种方法是将const之后的内容看做一个整体;
2. 另一种通过从右向左读的方法来进行识记。

将const之后的内容看作一个整体

  • char * const a;

    const和a之间没有*,说明a是不可写的,*a是可写的。
    也就是说a是一个常量指针,不可以将a指向其它变量,
    但可以改变*a,即通过指针a改变a所指变量的值。

    给常量a赋值后,a不能指向其它变量了,但可通过a来改变a所指变量的值。
    同时,这也意味着,a在创建时必须同时对其进行初始化赋值。

  • const char *a

    char const *a
    const和a之间有*,说明*a是不可写的,但a是可写的。
    也就是说这是一个指向常量的指针,不能通过该指针改变它所指变量的值。
    但可将该指针指向其它变量。

    指向常量的指针既可以指向常量,如const char b;也可以指向变量,如char b。
    但不能通过该指针该指针改变所指对象的值,即不能给*a再次赋值。
    这里可以这样理解:当指向常量的指针指向一个变量时,编译器会将该变量升级
    为常量。但是需要注意的是编译器不能将常量降级为变量,如果我们定义了一个
    指向常量的指针,那么当我们把该指针指向一个变量时,编译器就会报错。

从右往左读

  • char * const a;

    变量a -> const -> * -> char
    变量a是 -> 常量 -> 指针 -> 指向char
    常量指针意味着该指针只能指向一个地方,至于所指地方的数据是否会改变
    则不关心。常量指针就像一个门牌号,指向一个房间,至于房间里住的是谁
    则不关心,你可以把该房间租给A,告诉他门牌号让他住该房间,也可以租给
    B,给B门牌号,让B住进来,但是你不能把该门牌号拆了,挂到另一个房间上。

  • const char *a

    变量a -> * -> char -> const
    变量a是 -> 指针 -> 指向char -> char是常量
    char const *a
    变量a -> * -> const -> char
    变量a是 -> 指针 -> 指向常量 -> char
    a是指向常量的指针,不能通过*a来改变常量的值,但可将a指向其它地方。

代码例子

#include<iostream>using namespace std;int main(){    char a='a';    char b='b';    char c='c';    const char x='x';    const char y='y';    const char* p1;        //正确:指向常量的指针可以指向其他对象,                                 //在创建时不必初始化    const char* p2 = &a;   //正确:指向常量的指针可以指向一个‘变’量    const char* p3 = &x;   //正确:指向常量的指针可以指向一个‘常’量    //*p2 = b; *p2 = 'b';  //错误:p2是指向常量的指针,                                //不能通过*p2改变所指对象的值    p2 = &b;               //正确:p2是一个指针变量,可以指向其他位置    p2 = &x;    //char * const p4;     //错误:常量指针在创建时必须同时初始化    char * const p5 = &c;  //正确:常量指针可以指向‘变’量    //char * const p6 = &y;//错误:p6是指向变量的常量指针,y是一个常量,                                 //不能将常量自动转为变量    const char * const p7 = &y; //正确    //p5 = &a; p6 = &a;    //错误:常量指针不可以指向其他变量    *p5 = a;               //正确:常量指针所指向的内容可以修改}

总结

  • char * const a;
    常量指针,可通过*a改变所指变量的值,
    不能将a指向其它地址。
    创建时须同时初始化。

  • const char * a;/char const * a;
    指向常量的指针,可指向其它地址,
    不能通过*a改变所指常量的值。
    创建时不需要初始化。

  • const char * const a;
    指向常量的常量指针,不能将其指向其它地址,
    不能通过*a改变所指常量的值。
    创建时须同时初始化。

0 0