普通变量类型
const int a;
int const a;
测试代码
#include <stdio.h>
int main()
{
const int a = 1;
printf("a=%d\n", a);
int c = *(int*)&a = 2;
printf("a=%d c=%d\n\n", a, c);
return 0;
}
VS2019运行结果 结论
const int a = 1; 与int const a = 1; 等效- 应该在声明时就进行初始化
- 若不创建新的变量,只是强制类型转换并赋值,不会改变a的值。
指针类型
const int *p;
#include <stdio.h>
int main()
{
int a = 1, b = 2;
const int* p = &a;
printf("p=%x &a=%x\n", p, &a);
a = 4;
printf("a=%d\n", a);
p = &b;
printf("p=%x &b=%x\n", p, &b);
return 0;
}
VS2019运行结果 当*p = 5;这条语句没有被注释时,
结论
- 对于
const int* p; ,可以改变p的值,但不能改变*p的值,即可以改变p所存储的地址值,但不能通过改变*p来改变p所指对象的值。
int* const p;
#include <stdio.h>
int main()
{
int a = 1, b = 2;
int* const p = &a;
printf("*p改变前:\n*p=%d a=%d\n\n", *p, a);
*p = 3;
printf("*p改变后:\n*p=%d a=%d\n", *p, a);
return 0;
}
VS2019运行结果 当p = &b;这条语句没有被注释时, 结论
- 对于
int* const p; ,可以改变*p的值,但不能改变p的值,且*p的改变伴随着p所指变量值的改变。
const int* const p;
#include <stdio.h>
int main()
{
int a = 1, b = 2;
const int* const p = &a;
*p = 3;
p = &b;
return 0;
}
理解记忆的窍门
易混淆的其实就是两个指针类型int* const p; 和const int* p; 可以通过观察const修饰的是什么来加以区分。 int* const p; 中,const后紧接p,所以p是不能改变的;而 const int* p; 中,const后接的是整个int* p ,而int* p 代表的就是p所指对象,即表明p所指对象不能改变。 所以说了这么多,最关键的还是一点,即被const修饰的内容不可更改,是有内存的只读变量!
C++与C语言const的一点区别
int main()
{
const int a = 10;
int *p = (int*)&a;
printf("a=%d\n", a);
*p = 11;
printf("a=%d\n", a);
return 0;
}
c的结果: a=10 a=11
c++的结果: a=10 a=10
|