在c语言中,关键字const修饰变量,可以使得变量常量化。所谓的常量化,就意味着“readonly”。
它的规则:const离谁近,谁就不能被修改
下面我们一起来通过示例来看下:
一、const修饰变量
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 const int a = 10;
6 int const b = 10;
7
8 printf("a = %d,b = %d\n",a,b);
9 return 0;
10 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,b = 10
现在我们对变量进行下修改
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 const int a = 10;
6 int const b = 10;
7
8 a = 20;
9 b = 30;
10
11 printf("a = %d,b = %d\n",a,b);
12 return 0;
13 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘a’
a = 20;
^
test.c:9:4: error: assignment of read-only variable ‘b’
b = 30;
^
上面两种写法都是允许的,变量a和b有const修饰,则a和b的值不能被修改。
二、const修饰指针
1.常量化指针目标表达式,限制通过指针改变其目标的数值。一般形式如下:
const <数据类型> *<指针变量名> [=<指针运算表达式>]
请看下面示例代码:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 const int *p;
7
8 p = &a;
9 printf("a = %d,*p = %d\n",a,*p);
10
11 p = &b;
12 printf("b = %d,*p = %d\n",b,*p);
13 return 0;
14 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
b = 20,*p = 20
现在我们对指针的目标进行修改:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 const int *p;
7
8 p = &a;
9 printf("a = %d,*p = %d\n",a,*p);
10
11 p = &b;
12 printf("b = %d,*p = %d\n",b,*p);
13
14 *p = 30;
15 printf("*p = %d\n",*p);
16
17 return 0;
18 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:14:5: error: assignment of read-only location ‘*p’
*p = 30;
^
通过以上测试,我们没有办法通过p来改变目标地址的内容,最常见的用法就是main函数的参数。
2.常量化指针变量
常量化指针变量,是的指针变量存储的地址值不能修改,一般说明形式如下:
<数据类型> * const <指针变量名> [=<指针运算表达式>]
请看下面示例代码:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10;
6 int * const p = &a;
7
8 printf("a = %d,*p = %d\n",a,*p);
9 return 0;
10 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
现在我们来修改下代码:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 int * const p = &a;
7 p = &b;
8
9 printf("a = %d,*p = %d\n",a,*p);
10 return 0;
11 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:7:4: error: assignment of read-only variable ‘p’
p = &b;
^
通过以上示例,我们可以看出此时指针变量的指向是不可以修改的。
3.常量化指针变量及其目标表达式,一般说明形式如下:
const <数据类型> * const <指针变量名> [=<指针运算表达式>]
请看下面示例代码:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10;
6 const int * const p = &a;
7
8 printf("a = %d,*p = %d\n",a,*p);
9 return 0;
10 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
.yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
现在我们来修改下代码:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 const int * const p = &a;
7
8 p = &b;
9 *p = 30;
10
11 printf("a = %d,*p = %d\n",a,*p);
12 return 0;
13 }
程序运行结果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘p’
p = &b;
^
test.c:9:5: error: assignment of read-only location ‘*p’
*p = 30;
^
通过以上示例,我们可以看出,此时指针的指向和目标的内容都不可以修改。