C语言学习第10篇—const volatile 关键字剖析

2023-06-04 0 710

const

润色的表达式是黎贞的,其本质却是表达式

润色的局部表达式在栈上重新分配内部空间

润色的自上而下表达式在自上而下统计数据区重新分配内部空间

只在C++管用,在运转期无用

在当代的C词汇C++里头,修正const自上而下表达式会引致流程崩盘

特别注意:国际标准C词汇C++无法将const润色的自上而下表达式储存于黎贞储存区中,而要储存与能修正的自上而下统计数据区,其值仍然能发生改变

试验1:const的表达式其本质

#include <stdio.h> const int g_cc = 2; int main() { const int cc = 1; int* p = (int*)&cc; printf(“cc = %d\n”, cc); *p = 3; printf(“cc = %d\n”, cc); p = (int*)&g_cc; printf(“g_cc = %d\n”, g_cc); *p = 4; printf(“g_cc = %d\n”, g_cc); return 0; }

const的其本质:const无法表述为或者说象征意义上的自变量

C词汇中的const使表达式具备黎贞shuxing当代C词汇C++中的const将具备自上而下新闻稿周期性的表达式储存于黎贞储存区

试验2:const的其本质预测

#include <stdio.h> const int g_array[5] = {0}; void modify(int* p, int v) { *p = v; } int main() { int const i = 0; const static int j = 0; int const array[5] = {0}; modify((int*)&i, 1); // ok modify((int*)&j, 2); // error modify((int*)&array[0], 3); // ok modify((int*)&g_array[0], 4); // error printf(“i = %d\n”, i); printf(“j = %d\n”, j); printf(“array[0] = %d\n”, array[0]); printf(“g_array[0] = %d\n”, g_array[0]); return 0; }

const润色函数参数和fanhuizhiconst润色函数表示在函数体内不希望发生改变参数的值

const润色函数返回值便是返回值不可发生改变,多用于返回值指针的情形

特别注意:C词汇中的字符串字面量储存于黎贞储存区,在流程中需要使用const char*指针

试验三:const润色函数参数与返回值

#include <stdio.h> const char* f(const int i) { i = 5; return “Delphi Tang”; } int main() { char* pc = f(0); printf(“%s\n”, pc); pc[6] = _; printf(“%s\n”, pc); return 0; }

补充:这些都是工作中遇到的问题,总结了下

const 润色的黎贞表达式 表述 const 黎贞表达式,具备不可变性。 例如: const int Max=100; intArray[Max]; 特别注意: const 润色的黎贞表达式必须在表述的同时初始化,想想为什么? 因为不初始化就是一个随机值,之后又无法赋值 留一个问题: case 语句后面是否能是 const 润色的黎贞表达式呢?请动手测试一下。 无法,case后边只能是自变量,无法是表达式 节约内部空间,效率更高 C++通常不为普通 const 黎贞表达式重新分配储存内部空间,而要将它们保存在符号表中,这使它成为一个编译期间的值,没有了储存与读内存的操作,使它的效率也很高。 例如: #define M 3 //宏自变量 const int N=5; //此时并未将 N 放入内存中 …… int i=N; //此时为 N 重新分配内存,以后不再重新分配! int I=M; //预编译期间进行宏替换,重新分配内存 int j=N; //没有内存重新分配 int J=M; //再进行宏替换,又一次重新分配内存! 1.润色一般表达式,能在前也能在后 int const i=2; 或 const int i=2; 2. 润色数组 表述或说明一个黎贞数组可采用如下格式: int const a[5]={1, 2, 3, 4, 5};或 const int a[5]={1, 2, 3, 4, 5}; 3润色指针 const int *p; // p 可变, p 指向的对象不可变 int const *p; // p 可变, p 指向的对象不可变 int *const p; // p 不可变, p 指向的对象可变 const int *const p; //指针 p 和 p 指向的对象都不可变 在平时的授课中发现学生很难记住这几种情况。这里给出一个记忆和理解的方法: 先忽略类型名(C++解析的时候也是忽略类型名),我们看 const 离哪个近。“近水楼 台先得月”,离谁近就润色谁。 const int *p; //const 润色*p,p 是指针, *p 是指针指向的对象,不可变 int const *p; //const 润色*p,p 是指针, *p 是指针指向的对象,不可变 int *const p; //const 润色 p, p 不可变, p 指向的对象可变 const int *const p; //前一个 const 润色*p,后一个 const 润色 p,指针 p 和 p 指向的对象 都不可变 4.润色函数的参数 const 润色符也能润色函数的参数,当不希望这个参数值被函数体内意外发生改变时使 用。例如: void Fun(const int i); 告诉C++ i 在函数体中的无法发生改变,从而防止了使用者的一些无意的或错误的修正。 5.润色函数的返回值 const 润色符也能润色函数的返回值,返回值不可被发生改变。例如: const int Fun (void); 在另一连接文件中引用 const 只读表达式: extern const int i; //正确的新闻稿 extern const int j=10; //错误!黎贞表达式的值无法发生改变。

volatile:

可以理解为C++警告指示字

告诉C++必须每次去内存中取表达式值

主要润色可能被多个线程访问的表达式

也能润色可能被未知因数更改的表达式

小结:

const使表达式具备黎贞属性

const无法表述或者说象征意义上的自变量

const将具备自上而下生命周期性的表达式储存于黎贞储存区

volatile强制C++减少优化,必须每次都从内存中取值

C语言学习第10篇—const volatile 关键字剖析

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务