[C常量]C语言中的伪装大佬——伪常量const

为什么要介绍C语言的const呢?首先声明它和C++中的const不一样。许多人经常.CPP和.C混用,导致C++与C的const分不清,有时候莫名其妙的错误,包括我。当然,这只是原因之一。最主要的原因是C语言的const实在是太虚伪了。所以今天把C语言中这个狡猾的const列出来,以免之后犯错。

用法

首先以int为例定义整形常量a的两种方法:

1
2
const int a;
int const a;

当然,这两种方法其实是一样的,都代表的是整形常量。对于其他类型也是同样的方法。

不过对于指针,就有点特别了。首先强调,const和 的优先级是 优先级高于const。以下是以字符串为例的

3种定义方法。

1
2
3
const char *p;	//char const *p;
char * const p;
const char * const p; //char const * const p;

第一种指的是p是指向常量字符型数的指针,所指向的内存数据不可以被修改,但是本身可修改。

第2种指的是p是指向字符型数的常指针,所指向的内存数据可以被修改,但是本身不可被修改。

第3种是指向常量字符型数的常指针,所指向的内存数据补可被修改,本身也不可被修改。

伪常量

用法介绍完了,但为什么说C的const是伪常量呢?因为常量是不可被更改的,但const可以通过简介赋值所改变。我们首先说一下C中的const使用时需要注意的一些细节。

const是伪常量,无法用于数组的初始化和全局变量的初始化,本质就是限定一个变量不能直接赋值。

  如以下代码:

1
2
3
4
5
6
7
8
1 #define A 10
2 int arr[A];
3
4 //const本质,伪常量 ,无法用于数组初始化和全局变量初始化
5 /*
6 const int B = 10;
7 int arr[B];
8 */

  但是如果局部变量是能够初始化编译并运行的

1
2
3
4
5
1 void main()
2 {
3 const int B = 10;
4 int arr[B];
5 }

  const是伪常量,都知道常量是不能改变值的。例如这样是根本无法编译的。

1
2
3
4
5
6
1 void main() {
2 //num在栈区,只有栈区会自动回收释放
3 //局部const常量在栈区,而不在静态区(静态区会一直存在)
4 const int num = 10;//num就是一个常量
5 //num = 11; //const本质,限定一个变量不能直接赋值
6 }

  前面一直强调const是伪常量,因为可以间接的去改变它的值。利用指针变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 1 void main() {
2 //num在栈区,只有栈区会自动回收释放
3 //局部const常量在栈区,而不在静态区(静态区会一直存在)
4 const int num = 10;//num就是一个常量
5 //num = 11; //error const本质,限定一个变量不能直接赋值
6
7 //间接改变常量值
8 const int *p = #//定义一个指针指向一个常量,存储num的地址
9 int *pv = (int *)p;//对指向常量的指针进行强制转换
10 *pv = 8;//对指针指向内容赋值
11
12 printf("%d",num); //8
13
14 }

结论

c语言的const是冒牌货。C语言const的含义是被称为一个不能被改变的普通变量 ,它会分配内存。


文章结束了,但我们的故事还在继续
坚持原创技术分享,您的支持将鼓励我继续创作!