版权声明: https://blog.csdn.net/qq_40794602/article/details/85108368
.c文件
#include<stdio.h> const int m_a = 10; //全局作用域的const不能使用指针进行修改 int main() { const int m_b = 10; int *p = (int *)&m_b; *p = 100;//C语言中可以通过这种方式进行修改 printf("m_a:%d *p:%d\n", m_b,*p);//m_a和*p打印的都是100 return 0; }
.cpp文件
#include<iostream> using namespace std; const int m_a = 10; //C++const修饰的全局作用域同样不可以修改 int main() { const int m_b = 10; int *p =(int *)&m_b; //这里一定要进行强制转换,C+对类型控制的比较严格 *p = 100; cout << "m_b:" << m_b << " " << "*p:" << *p << endl; //m_b打印的还是10,*p打印的是100 return 0; }
在C++语言中const int m_a = 10;会在内存中生成一个符号表,m_a指向10,并不会为m_a分配内存,当执行int *p = &m_a;时,会为*p开辟新的空间,所以修改了*p的值并不会修改m_a的指向的值
在C语言中 const修饰的变量默认是外部链接(即extern),在C++中const修饰的变量默认是内部链接(static),不过我们可以在const前加上static或者extern来控制这个变量究竟是内部链接还是外部链接
C++const分配内存,在一般情况(const int a = 100)不会为这个修饰的变量分配内存,所以我们无法通过指针进行修改。但是以下情况,C++会为const修饰的变量分配内存,也就是说以下情况可以通过指针修改被const修饰的变量的值(针对局部作用域的变量)
#include<iostream> using namespace std; int main() { //1.对const取地址会分配内存 const int a = 10; int *p = (int *)&a;//此时会为*p分配内存 *p = 100; cout <<"*p:"<< *p << endl; //2.2、当加入extern 修饰const,也会分配内存 全局区 指针不能修改 //extern会将const修饰的变量提升为全局变量,但是不能修改因为该变量是在全局区的ro.data区 全局变量没有用extern const修饰, 而是单纯的const修饰, 那么全局变量位置还是处于ro.data,只是作用域变小,当前文件内。 //3.用变量初始化const变量 int b = 10; const int c = b; *(int *)(&c) = 100; //因为分配了内存便可以使用指针进行修改 cout << "c:" << c << endl; //4.const 修饰的自定义数据类型 struct Test { int e; }; const Test d; Test *p2 = (Test *)&d; p2->e = 100; cout << "d.a:" << d.e<< endl; return 0; }
C++中推荐使用const代替宏定义