const 是 constant 的缩写,意思是“恒定不变的”!
它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。
一、const 简介
1. 功能
const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
它限定一个变量不允许被改变,产生静态作用。
2. 存储位置
const 修饰全局变量:存储在常量区
const 修饰局部变量:存储在栈区
具体验证代码如下:
#include <stdio.h>
int mq0; //未初始化变量
int mq1 = 1;//全局变量
static int mq2 = 2;//静态变量
static int mq3= 3;
const int mq4 = 4;//只读全局变量
const int mq5 = 5;
int main(void)
{
const int mq6 = 6;//只读局部变量
const int mq7 = 7;
int mq8 = 8;//局部变量
int mq9 = 9;
printf("0x%p: %d\n", &mq0 , mq0);
printf("0x%p: %d\n", &mq1 , mq1);
printf("0x%p: %d\n", &mq2 , mq2);
printf("0x%p: %d\n", &mq3 , mq3);
printf("0x%p: %d\n", &mq4 , mq4);
printf("0x%p: %d\n", &mq5 , mq5);
printf("0x%p: %s\n", "A", "A");
printf("0x%p: %s\n", "B", "B");
printf("0x%p: %d\n", &mq6 , mq6);
printf("0x%p: %d\n", &mq7 , mq7);
printf("0x%p: %d\n", &mq8 , mq8);
printf("0x%p: %d\n", &mq9 , mq9);
return 0;
}
运行结果如下:
0x00404090: 0
0x00402000: 1 //全局/静态区
0x00402004: 2
0x00402008: 3
0x00403000: 4 //常量区
0x00403004: 5
0x00403012: A
0x0040301E: B
0x0060FF24: 6 //栈区
0x0060FF20: 7
0x0060FF1C: 8
0x0060FF18: 9
二、const 用法
1. 变量
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。
const int MQ=520;
MQ++; //会产生错误
修饰全局变量
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
const 修饰全局变量是不能通过指针来改变其值的,原因是因为它存储在常量区。
修饰局部变量
const int n=520;
int const n=520;
const 和变量类型 int 可以互换位置,二者是等价的,即上两条语句等价。
const 修饰局部变量是可以通过指针来改变其值的,原因是因为它存储在栈区。
#include <stdio.h>
int main(void)
{
const int mq = 520;
int *p = &mq;
*p = 200;
printf("mq=%d\n",mq);
return 0;
}
2. 指针
我们以星号为分界线,如果const在星号的左边则为常量指针,如果const在星号的右边则为指针常量。
如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。
int const * n;是常量指针,int *const n;是指针常量。
常量指针
常量指针是指针指向的内容是常量。
可以有以下两种定义方式:
const int * mq;
int const * mq;
使用说明
- 常量指针:是不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值的。
int m=520;
const int* i=&m;
m=1314;
- 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
int a=520;
int b=1314;
const int* n=&a;
n=&b;
指针常量
指针常量是指针本身是个常量,不能在指向其他的地址。
写法如下:
int *const n;
指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。
int a=520;
int *p=&a;
int* const n=&a;
*p=1314;
指向常量的常指针
是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。
const int* const m;
3. 函数
修饰函数的参数
const修饰函数的参数有三种情况:
- 防止修改指针指向的内容
void mq (const int m);
如果函数内改动变量m的值,编译器就会报错。
2. 防止修改指针指向的地址
void mq ( int * const m1 , int * const m2 )
指针m1和指针m2指向的地址都不能修改。
3. 以上两种的结合。
修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
const char * MQ(void);
char *mq = MQ(); //编译器报错
const char *mq = MQ(); //正确
C语言32个关键字
有32个关键字详细说明,还有跳转链接!