c++中的const和volatile知识自我总结

学习了下c++中的const关键字,总结如下。

1、const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”。

int main()
{
	const int a = 6;
	cout << a << endl;
	a = 10;
	cout << a << endl;
	return 0;
}

2、如果通过指针强行修改呢,如下面代码这样子。

int main()
{
	const int a = 6;
	cout << a << endl;

	int *p = (int*)&a;
	cout << p << endl;
	cout << *p << endl;

	*p = 12;
	cout << *p << endl;
	cout << a << endl;
}

编译可以通过,但是输出来之后可以看到a还是6,但是*p是12。

这是怎么回事?p明明是指向变量a的一个指针,怎么会指针指向的内存空间存储的变量的值已经修改了,但是输出仍然是改变前的值?

笔者看了一些资料,【应该是】因为编译器对于const类型的变量都不会二次读取,只会在最开始的时候从内存中读取一次,之后存储在常量表中,之后需要用到就从常量表中取得。

所以即便指针指向的值已经修改过了,但是读取仍然是改变前的值。

3、常量指针和指针常量

常量指针:指向常量的指针,也就是指针指向的是一个常量,值不可以改变,但是指针本身地址可以改变,可以指向其他地址。

指针常量:指针地址是个常量,指针本身地址不能改变,但是指针指向的变量的值可以改变。

常量指针有两种写法,如下两种。

const int *p1;
int const *p2;

这两种都是说指针是个const int类型的指针,只不过const的位置比较飘忽,可以在int前面,也可以在int后面。

指针常量只有一种写法,如下。

int a=2;
int* const p3=&a;

指针常量是int类型的指针,定义的时候必须初始化地址,因为指针常量不能被修改地址。

4、volatile是一个指令关键字,也是用来修饰类型的,告诉编译器这个变量是可变,不要对其进行优化。

通常来讲,编译器会对代码进行优化,详细解释我觉得这篇博客写得很好,大家可以参考一下这一篇https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html

总的来说,volatile可以确保每次使用变量的时候,都从内存中重新读取,而不允许编译器对这个变量的读取操作进行优化。一般在多任务环境下会用到这个关键字。

volatile的指针和const一样,分两种,见以下代码。

volatile int *p1;//volatile int类型的指针,禁止编译器优化指针指向的变量,但是可以优化指针本身地址
int volatile *p2;//同上,另一种写法

int* volatile p3;//int类型的指针,禁止编译器优化指针本身地址,但是可以优化指针指向的变量

以上,如有错漏,还请指出~

原文地址:https://www.cnblogs.com/chenjx85/p/10747802.html

时间: 2024-10-28 01:58:45

c++中的const和volatile知识自我总结的相关文章

C中的const,volatile与restrict

volatile表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.它可以适用于基础类 型如:int,char,long......也适用于C的结构和C++的类.当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员 都会被视为volatile.该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程.简单示例:DWORD __stdcall th

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

宏定义的用法以及再次解释const和volatile

__I. __O .__IO是什么意思?这是ST库里面的宏定义,定义如下:#define     __I       volatile const        /*!< defines 'read only' permissions      */#define     __O     volatile                  /*!< defines 'write only' permissions     */#define     __IO    volatile      

C之 const 和 volatile(九)

在  C 语言中,我们经常会见到 const 和 volatile 这两个关键字,那么我们今天就来介绍下这两个关键字. 先来介绍 const 关键字.提起 const 关键字,我们可能首先想到的是经过它修饰的变量便是常量了.其实我们这种想法是错误的,其实 const 修饰的变量是只读的,其本质还是变量.它修饰的局部变量是在栈上分配空间的,它修饰的全局变量在全局数据区分配空间(也就是我们平时所说的 read-only data 段),const 只在编译期有用,在运行期无效.注意:const 修饰

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型

const、volatile、mutable的用法

原文:http://dev.yesky.com/393/3007393.shtml const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变. 例如: const int nValue:    //nValue是const int const

C/C++中的const真正的用法

const基础知识(用法.含义.好处) intmain() { constint a; intconst b; constint *c; int* const d; constint * const e ; return0; } Intfunc1(const ) 初级理解:const是定义常量==>const意味着只读 含义: //第一个第二个意思一样代表一个常整形数 //第三个c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) //第四个d常指针(指针变量不能被修改,但

C与C++中的const

同样,有下面一段代码: 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 const int i = 0; 7 int *j = (int *) &i; 8 *j = 1; 9 cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x&qu