C语言:关键字---const(声明只读变量)

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;

使用说明

  1. 常量指针:是不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值的。
int m=520;
const int* i=&m;
m=1314;
  1. 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
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修饰函数的参数有三种情况:

  1. 防止修改指针指向的内容
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个关键字详细说明,还有跳转链接!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值