const 的使用

简介: const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。

关于const的基本认识


const的基本概念


const 是"constant"的缩写,意思是永恒不变的,它定义的是只读变量的关键字,或者说是定义常变量的关键字。


特点:


说const定义的是变量,但又相当于是常量。说它定义的是常量,但它又有变量的特点,所以作常变量。


1.用const定义的变量的值是不能在修改的。它定义的是只读变量,所以必须在定义的时候就要给它初始化。


int main()
{
  int a = 20;
  a = 30;//局部变量是可以修改的
//  int const b=10;const写在int左边和右边都是可以的。都是修饰b
  const int b = 10;
  (错误)b = 15;//被const修饰的b无法再修改,初始化后就不能修改了
  return 0;
}


2.用const修饰的变量,无论是全局变量话说局部变量,生命周期都是程序运行的整个过程。全局变量的生命周期是整个过程而用const修饰过后的变量因为拥有了静态特性,它的生命周期也是程序运行的整个过程。但是注意用const修饰的局部变量只是有了静态特性,并没有说它变成了静态变量。

注意点:


1.我们知道,局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量


2.数组的长度不能是变量。虽然 const 定义的是只读变量,就相当于是定义一个常量。但是只读变量也是变量,所以 const 定义的变量仍然不能作为数组的长度。但是需要注意的是,在 C++ 中可以!C++ 扩展了 const 的含义,在 C++ 中用 const 定义的变量也可作为数组的长度。


const VS define


很多人在学习 const 的时候都会混淆它与 define 的区别。从功能上说它们确实很像,但它们又有明显的不同:


1


define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。


2.


const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏。


3.


const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。


const 在 *指针的左边


const在*的左边对指针有什么影响呢?


int main()
{
  int a = 10;
   int* p = &a;
  *p = 20;
  printf("%d", a);
  return 0;
}


这段代码表示通过对指针p解引用改变了a的值。


如果将const 加在int *p=&a;的前面 const int *p=&a;



9e4593207a1a4216b04ebeaa2567d6c4.png


const 修饰的是 * p,使得 *p指向的内容(也就是a)不能修改了,所以 *p(a)不能再改变了。


指针指向的内容不能改变但指针是可以改变的,


int main()
{
  int a = 10;
  int b = 20;
  const int* p = &a;
  *p = 20;//这个操作是不可以的 
  p = &b;//这个操作是可以的
  return 0;
}


还有const在int的左边和右边是一样的都是修饰 *p的


int main()
{
  int a = 10;
  const int* p = &a  —————— int const *p=&a; 两种写法是一样的,都是修饰*p 都是在*的左边
  return 0;
}


const 在 *指针的右边


const在*右边修饰的是指针了,倒置指针无法修改,但是指针指向的内容是可以修改的。


int main()
{
  int a = 10;
  int b = 20;
   int* const p = &a;
  //cosnt在*的右边修饰的是指针变量p,所以指针变量p无法修改,但是指针p指向的内容可以修改
  p = &b;//这个操作是不行的
  *p = 20;//这个操作是可以的
  return 0;
}


总结:


const对指针的影响:


*const在 * 的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在 的右边,则指针的指向不可变。简记为"左定值,右定向"简记"左定值,右定向"

相关文章
|
11月前
|
安全 编译器 C++
对C++中const的说明
对C++中const的说明
49 0
详解const
C++中提供了很多关键字赋予一些东西特殊的函数,比如const、override、final等,本文将从有类和无类两个方面详细介绍const的相关用法于注意事项。剩下的等我这几天加班加点更新吧!
|
9月前
const
const
166 0
const int*p 与 int const *p与 int * const p与const int * const p的区别(有明显对比,超级详细,超级好记)
当只有一个const并且const在*左边时: (const int*p 与 int const *p,)*p的值不能改,但是p(地址)能改.我们可以看到第一,三张图片第五行*p下面有红线表示错误.而第二,四张没有红线的地方表示正确.所以我们可知道const int*p 与 int const *p是相同的只是书写方法不同.
56 0
C++ int const 和 const int 的区别
C++ int const 和 const int 的区别
139 0
|
JavaScript 前端开发
let和const
let和const
|
JavaScript 前端开发
一个非常常见的问题:var、let和const
在ECMAScript中,有3个关键字可以用于声明变量。分别是:var、let和const。其中,var在所有ECMAScript都是可以使用的,但是let和const需要在ECMAScript6及其以上版本才可以使用。
105 0
一个非常常见的问题:var、let和const