const 关键字
Posted syyxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const 关键字相关的知识,希望对你有一定的参考价值。
今天回家路上,在一篇博客中发现了这么一个问题:
请解释下面的声明代表的含义。
const int a; int const a; const int *a; int * const a; int const * a const;
然后后面有解释如下:
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
我只知道const意味着不可修改, 但是让我说出这4种的区别, 的确有点蒙圈, 因此编码验证。
1 #include<stdio.h> 2 3 void main(void) 4 5 { 6 7 #define Q1 8 9 #ifdef Q1 10 11 /* 12 13 * 问题1: 14 15 * const int a; 16 17 * int const a; 18 19 * const int *a; 20 21 * int * const a; 22 23 * int const * a const; 24 25 * 上面的声明都是什么意思? 26 27 */ 28 29 30 31 const int a; 32 33 int const a1; 34 35 const int *a2; 36 37 int * const a3; 38 39 int const * a4 const; 40 41 #if 0 42 43 a = 5; 44 45 a1 = 5; 46 47 a2 = NULL; 48 49 a2 = malloc(2); 50 51 *a2 = 1; 52 53 a3 = NULL; 54 55 a3 = malloc(3); 56 57 *a3 = 2; 58 59 a4 = NULL; 60 61 a4 = malloc(4); 62 63 *a4 = 4; 64 65 #endif 66 67 #endif 68 69 }
编译的时候就报错:
可见 int const * a const; 的写法, 本身就是错误的, 我们将其改为:
Int const * const a; 然后继续编译。 编译没有警告和报错, 证明我们的语法是没问题的。
然后将第41行的#if 0 放开,编译。
然后报错如下:
通过以上报错我们可以总结如下:
const int a 和 int const a1: 效果是一样,都代表了 a 的只读。
const int *a2: 给a2指针赋值(a2=NULL), 不报错, 但是给a2所在地址的值赋值(*a2 = 1) 则报错, 说明const 修饰的是值(*a2),而不是指针(a2)。
int * const a3: 给a3指针赋值(a3=NULL),报错, 但是给a3所在地址的值赋值(*a3 = 2) 则报错, 说明const 修饰的是指针(a3),而不是值(*a3)。
int const * const a4: 给a4指针赋值(a4=NULL),报错。给a4所在地址的值赋值(*a4 = 4) 也报错。则说明这样的修饰方式既不能给值赋值,也不能给指针赋值。
以上是关于const 关键字的主要内容,如果未能解决你的问题,请参考以下文章
如何用“let”和“const”替换此代码中的“var”关键字?
为啥在片段中从 char* 转换为 std::string 比转换为 const char* 更可取?