const
什么时候是只读变量,什么时候是常量
简单的说在编译期间不能确定值得const标识符都被当做是只读变量
/*只有用字面量初始化的才会进入符号表*/
const int a=; //常量
int b=1;
const int c=b; //只读变量
//简单的说在编译期间不能确定值得const标识符都被当做是只读变量
volatile修饰的const常量不会进入符号表
#include <stdio.h>
int main(void)
{
const int x = 1; //常量x=1
const int& rx = x; //会产生一个只读属性的新变量
int& nrx = const_cast<int&>(rx);//去除引用rx的只读属性
nrx = 5;
printf("x = %d\n", x); // 1 常量
//const引用会生成一个具有只读属性的变量
printf("rx = %d\n", rx); // 5
printf("nrx = %d\n", nrx); // 5
//引用只是变量的别名所以内存地址都是相同的,在这种情况下编译器会位const分配内存
printf("&x = %p\n", &x); //0000008C4E8FF694
printf("&rx = %p\n", &rx); //0000008C4E8FF694
printf("&nrx = %p\n", &nrx); //0000008C4E8FF694
/***************************************************************************************************/
//volatile修饰的const常量不会进入符号表,所以一定是个只读变量
volatile const int y = 2;
int* p = const_cast<int*>(&y); // 通过const_cast强制类型转换后y只是一个普通类型的指针变量
*p = 6; //通过指针修改y的值
printf("y = %d\n", y); //6
printf("p = %p\n", p); //一个合法的地址
/*************************************************************************************************/
const int z = y; //编译器不能直接知道y的值所以是只读变量
p = const_cast<int*>(&z); //通过强制类型转换去除只读属性更改他的值说明确实是一个只读属性
*p = 7;
printf("z = %d\n", z); //7
printf("p = %p\n", p); //
/*************************************************************************************************/
char c = 'c'; //变量c
char& rc = c; //引用
const int& trc = c; //只读属性的引用
rc = 'a';
printf("c = %c\n", c); //a c本身是个变量
printf("rc = %c\n", rc); //a
printf("trc = %c\n", trc); //c 只读属性
return 0;
}
引用数组
C++中,不支持引用数组,因为会使得相邻数组元素的地址之差,不是连续地址
引用数组破坏了C语言的特性,数组的每个元素都是彼此相邻的排放
const引用的初始化类型不同,将得到新的只读变量
//不同类型的变量去初始化const标识符
char c = 'c';
char& rc = c; //引用rc代表变量c
//const引用的初始化类型不同(c是char,而trc是int),将得到新的只读变量
//trc代表一个只读变量
const int& trc = c;//char类型默认转换为int类型
//const char& trc = c;//未做类型转换还是打印a 这就说明了是产生了一个新的变量
rc = 'a';
printf("c = %c\n", c); //a
printf("rc = %c\n", rc); //a
printf("trc = %c\n", trc); //c const引用的初始化类型不同,将得到新的只读变量!!!!