05-const

作者: ducktobey | 来源:发表于2019-11-06 23:48 被阅读0次

const

const是常量的意思,被其修饰的变量不可修改

我们在定义普通局部变量的时候,通常是这样来进行定义的

int main() {
    int age = 10;
    age = 20;
    getchar();
    return 0;
}

我们在定义的时候,为其赋了初始值然后我们可以在后面需要修改变量值的地方,进行修改,比如我们后面将age的值修改为20;

但是通过const修饰的变量,是不可以修改的,因此不可以以这种方式来编写程序

int main() {
    const int age = 10;
    age = 20;
    getchar();
    return 0;
}

这样编写程序,编译器会提示错误。

并且也不允许在定义的时候不赋初始值,在后面使用到的地方在赋初始值,因此下面这种方式也是错误的。

int main() {
    const int age;
    age = 20;
    getchar();
    return 0;
}

这样编写程序,编译器同样会提示错误。

如果const修饰的是类,结构体(的指针),其成员变量也不可以修改。例如下面的这种写法也是错误的

struct Date {
    int year;
    int month;
    int day;
};

int main() {
    const Date d = {2011, 2, 5};
    d.year = 2015;
    return 0;
}

编译器也会报错

了解完const以后,我们来看看一个有趣的问题。以下5个指针,分别代表什么含义?

int age = 10;
const int *p0 = &age;
int const *p1 = &age;
int * const p2 = &age;
const int * const p3 = &age;
int const * const p4 = &age;

上面的指针问题,可以用以下结论来解决

const修饰的是其右边的内容

因此,假设我们有下面的这段代码

int main() {
    int age = 10;
    int height = 30;
    int age = 10;
    const int* p0 = &age;
    int const* p1 = &age;
    int* const p2 = &age;
    const int* const p3 = &age;
    int const* const p4 = &age;
    *p2 = 20;
    p2 = &height;
    *p2 = 40;
    getchar();
    return 0;
}

我们发现,最终报错的是p2,*p2没有报错

原因是现在const修饰的是p2,所以现在p2是常量,但是*p2不是常量,最终的结果就是 *p2可以赋值,p2不可以赋值。

如果我们现在将上面代码的下面部分

*p2 = 20;
p2 = &height;
*p2 = 40;

p2修改为p0的话。现在哪些地方会报错呢?

同样的,利用我们前面的结论,我们知道,现在const修饰的是*p0是常量,p0不是常量,所以 *p0不能被赋值,因此修改 *p0的地方都会报错

另外,p0和p1其实是一样的,const修饰的都是*p0和 *p1,因此两个没区别,同理const int * const p3 = &ageint const * const p4 = &age也是等价的。两个const中前面的一个修饰 *p3与 *p4,后面的一个修饰p3,p4,因此p3,p4, *p3, *p4均为常量。

demo下载地址

文章完。

相关文章

  • 05-const

    const const是常量的意思,被其修饰的变量不可修改 我们在定义普通局部变量的时候,通常是这样来进行定义的 ...

网友评论

      本文标题:05-const

      本文链接:https://www.haomeiwen.com/subject/cptmbctx.html