常量

常量

常量概念

​ 在程序运行前就已经存在,它们被编译到可执行文件 中,当程序启动后,它们便会被加载进来。这些数据通常都会保存在 常量数据区中,该区的属性没有写权限。

常量定义

1. #define定义常量

​ 编译器在对其进行编译时,会将代码中的宏名称替换成对应信息。宏的使用可以增加代码的可读性

2. const

​ 将变量定义为一个常量。const是为了增加程序的健壮性而存在的

#define 和 const 的区别

  1. define是一个真常量,const是一个假常量

  2. 使用const定义的变量最终还是一个变量(只是编译器内进行了检查,发现有修改则报错)
  3. 编译器在编译期间对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]);
posted @ 2023-01-19 15:41  修竹Kirakira  阅读(30)  评论(0编辑  收藏  举报