const和volatile分析

c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量;会占用内存空间;本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值)

1 const int abc=1;
2
3 int *p=&abc;
4
5 *p=3;
6
7 printf("%d\n",abc); //3
 1 const int* p; //p可改变,p指向的内容不可改变
 2
 3 int const* p; //p可变,p指向的内容不可改变
 4
 5 int* const p; //p不可变,p指向的内容可变
 6
 7 const int* const p; //p和p指向的内容都不可变
 8
 9 //当const出现在*左边的时候,指针指向的内容不可改变
10
11 //当const出现在*右边的时候,指针本身的内容不可改变
12
13 内容不可变,不是绝对的,任然可以通过指针改变其内容  左数右指:在左边,数据内容不可变;在右边,指针内容不可变

const修饰的函数参数表示在函数体内不希望被改变;const修饰的函数返回值表示返回值不可改变,多用于返回指针的情形。

 1 const int* func()
 2
 3 {
 4
 5   static int count = 0;
 6
 7   count++;
 8
 9   return &count;
10
11 }
12
13 int main()
14
15 {
16
17   int i = 0;
18
19   const int* p=func();
20
21   printf("%d\n",*p);
22
23   return 0;
24
25 }
 1 const int* func()
 2
 3 {
 4
 5   static int count = 0;
 6
 7   count++;
 8
 9   return &count;
10
11 }
12
13 int main()
14
15 {
16
17   int i = 0;
18
19   int* p=func();  // 会报出错
20
21   printf("%d\n",*p);
22
23   return 0;
24
25 }

volatile:用于告诉编译器每次去内存中取变量的值,不去做优化;主要修饰可能被多个线程访问的变量;也可以修饰被未知因素被改变的变量:
编译器的优化:如果发现某个变量从未出现过在赋值左边的情况,那么这个变量就直接替换成其值,但是如果被其他因素修改,所以就会出错。

1 volatile int i=0;
时间: 2024-10-19 14:02:20

const和volatile分析的相关文章

C语言进阶——const 和 volatile 分析09

const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 注意:const修饰的变量不是真的常量,他只是告诉编译器该变量不能出现在赋值符号的左边 const全局变量的分歧: 在现代C语言编译器中,修改const全局变量将导致程序崩溃 标准C语言编译器不会将const修饰的全局变量存贮于只读存贮区中,而是存贮可修改的全局数据区,其值依然可以改变 程序实例1:

C语言-const和volatile深度分析

1.const只读变量 const修饰的变量是只读的.本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 const修饰的变量不是真的变量,它只是告诉 编译器该变量不能出现在赋值符号的左边实例一.cpp: 1 #include <stdio.h> 2 3 const int g_cc = 2; 4 5 int main() 6 { 7 const int cc = 1; 8 9 int* p = (int*

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 ,枚举类型等(二)自定义类型

C之 const 和 volatile(九)

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

【C++】const、volatile不能修饰没有this指针的成员函数

一般所有的成员函数都只有一个复本,当不同的对象调用成员函数时,为了区分是哪个成员在调用,会传入this指针. 当调用有const.volatile修饰的成员函数时,会相应的传入一个const.volatile修饰的this指针. 故const.volatile不能修饰没有this指针的成员函数. 如:const.volatile不能修饰static成员函数

void指针意义、Const、volatile、#define、typedef、接续符

1.C语言规定只有相同类型的指针才可以相互赋值. Void*指针作为左值用于接收任意类型的指针, void*指针作为右值赋给其他指针时需要强制类型转换. 2.在C语言中Const修饰的变量是只读的,本质还是变量. 口诀:左数右指  不可改变: 当Const出现在*号左边时,指针指向的数据为常量. 当Const出现在*号右边时,指针本身为常量. const int* p ; //P可变,P指向的内容不可变 int const * p; //跟上一句一样 int *const p; //p不可变,p

const,volatile,static,typdef,几个关键字辨析和理解

1.const类型修饰符 const它限定一个变量初始化后就不允许被改变的修饰符.使用const在一定程度上可以提高程序的安全性和可靠性.它即有预编译命令的优点也有预编译没有的优点.const修饰的变量被编译器处理只读变量(不是常量,常量是放到内存的只读区域的)放在内存中,由编译器限定不允许改变. (1)具有不可变性.  例如:const int Max=100; Max++会产生错误; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患. 例如: void f(const i

C++ const、volatile、mutable的用法 (转)

  const.volatile.mutable的用法 鸣谢作者: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变. 

const和volatile同时修饰同一个变量

主要要搞清楚 编译期 和 运行期的关系. 编译期就是 C 编译器将 源代码转化为 汇编再到机器代码 的过程. 运行期就是 实际的机器代码在CPU执行 的过程.很多书上说的东西,其实都只是指编译期进行的事情.const 和 volatile 也一样,所谓的 const ,只是告诉编译器要保证在 C的"源代码"里面,没有对该变量进行修改的地方,就是该变量不能而出现在赋值符号左边.实际运行的时候则不是 编译器 所能管的了.同样,volatile的所谓"可能被修改",是指&