天河网站 建设信科网络,企业网站推广按成交收费,求职简历模板免费可编辑,18款禁止未成年软件app一、问题描述 当一个变量声明为const时#xff0c;通常是不可以改变它的值的#xff0c;程序设计过程中也不应该这么做。
const int num 666;//我们不应该对num的值进行修改
// num 777; 此语句是错误的 当然#xff0c;如果我们写以下语句#xff0c;程序编译也会出现…一、问题描述 当一个变量声明为const时通常是不可以改变它的值的程序设计过程中也不应该这么做。
const int num 666;//我们不应该对num的值进行修改
// num 777; 此语句是错误的 当然如果我们写以下语句程序编译也会出现这样的错误
int *p num;//程序会报错无法将const int *转换为int * 但如果我们强制转换就会发现程序编译通过了
int *p (int *)num;//程序编译通过 这种程序执行之后通过指针p访问num和直接访问num的值是怎样的呢让我们一探究竟。
二、执行结果 程序代码如下(注意C语言和C的执行结果是不同的)
int main() {const int num 666;int *p (int *)num;*p 777;printf(num : %d, *p : %d, num, *p);return 0;
}
2.1 C语言的执行结果 我们补全C语言的代码并将其放入一个.c文件中
#includestdio.hint main() {const int num 666;int *p (int *)num;*p 777;printf(num : %d, *p : %d, num, *p);return 0;
} 我们先看程序的执行结果 结果显示二者的值都被改变了。原因是C语言的const关键字为运行时const编译期间只是定义在运行时才会初始化。因此这就是C语言中的const变量不能作为数组长度的原因。
2.2 C的执行结果 我们将以下C代码放入一个.cpp文件中
#include iostreamusing namespace std;int main(){const int num 666;int *p (int *)num;*p 777;cout num : num , *p : *p endl;return 0;
} 执行结果如下 我们可以看到直接访问num的值并没有改变而通过指针p间接访问到的值改变了与C语言执行结果不同。因为C的const变量为编译时const是像#define宏定义一样使用的常量。
2.3 补充那const变量空间的值到底改变了吗 结论是的const变量的值的确被改变了。而且二者访问的是同一段空间。
那在C执行结果中为什么直接访问和间接访问会出现两种不同的结果呢
我们可以通过以下代码看到两段空间的地址
#include iostreamusing namespace std;int main(){const int num 666;int *p (int *)num;*p 777;cout num : num , *p : *p endl;cout num s address : num endl;cout (*p)s address : p endl; return 0;
} 通过以上执行结果我们可以看到两次的地址都是同一个值说明他们两个是同一段空间。
二者不同的原因为了C程序运行的效率更高编译器会将常量表中的值缓存在栈中。当我们直接访问num时访问的其实是栈中的缓存值而此时被改变的值并没有同步过来。而我们通过指针*p间接访问的是那段内存空间因此就是被改变之后的值。