常量
常量
常量概念
在程序运行前就已经存在,它们被编译到可执行文件 中,当程序启动后,它们便会被加载进来。这些数据通常都会保存在 常量数据区中,该区的属性没有写权限。
常量定义
1. #define定义常量
编译器在对其进行编译时,会将代码中的宏名称替换成对应信息。宏的使用可以增加代码的可读性
2. const
将变量定义为一个常量。const是为了增加程序的健壮性而存在的
#define 和 const 的区别
-
define是一个真常量,const是一个假常量
- 使用const定义的变量最终还是一个变量(只是编译器内进行了检查,发现有修改则报错)
- 编译器在编译期间对const变量进行检查,所以可以通过指针获取const修饰过的变量地址,强制将指针的const修饰去掉
const int nConst=5;
int *pConst=(int*)&nConst;
#define | const |
---|---|
在编译期间查找替换 | 在编译期间检查const修饰的变量是否被修改 |
由系统判断是否被修改 | 由编译器限制修改 |
字符串定义在文件只读数据区,数据常量编译为立即数寻址方式,成为二进制代码的一部分 | 根据作用域决定所在的内存位置和属性 |
修改被const修饰的变量
#include <stdio.h>
int main(int argc, char* argv[]) {
const int n1 = 5;
int *p = (int*)&n1;
*p = 6;
int n2 = n1;
return 0;
}
更改常量字串
以下代码中 TCHAR *v1="Hello World";//常量字串 该常量字符串所在的页面属性为只读
int LastError = 0;
TCHAR *v1 = "HelloWorld";
_tprintf(_T("%c\r\n"),v1[0]);//只读
DWORD NewProtect = PAGE_READWRITE;
DWORD OldProtect = 0;
//虚拟保护
BOOL IsOk = VirtualProtect(v1, 20, NewProtect, &OldProtect);
if (IsOk == FALSE)
{
LastError = GetLastError();//更改页面属性
}
v1[0] = 'X';
_tprintf(_T("%c\r\n"), v1[0]);