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”关键字?

vue2.0 代码功能片段

为啥在片段中从 char* 转换为 std::string 比转换为 const char* 更可取?

Kotlin基础 关键字:const

C++中的const关键字深入理解(关于引用指针顶层const)

const关键字的使用