// const
// c++ 中 const 在定义时不会创建内存空间，取地址时会创建内存空间
// 或者把它定义为 extern 时，也会创建内存空间

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    /*     
    const int n = 10;            // 不会创建内存空间，相当于宏定义
    printf("n addr = %p\n", &n); // 取 const 变量的地址时会创建内存空间
    return 0;
     */

    /* 
    // C++ 中 const 的特性：在定义时不会创建内存空间，取地址时会创建内存空间
    const int x = 10;   // 在符号表中创建 x，即没有在栈中开辟空间
    int *p = (int *)&x; // 在栈中开辟空间，p 指针指向，空间的值是 x 符号表中的数据
    *p = 100;           // 修改的是栈中的空间，而不是符号表中的数据
    cout << "x = " << x << endl;
    cout << "*p = " << *p << endl;
    */

    // 如果 const 变量初始化为一个变量时，则会在栈中开辟空间
    int x = 20;         // 在栈中开辟空间，存储常量 20
    const int X = x;    // 在符号表中创建 X，并且赋值变量，此时在栈中开辟空间，存储常量 20
    int *p = (int *)&X; // p 指向了 x 的地址，但是 x 是 const，所以 p 不能修改 x 的值
    *p = 100;           // 会修改栈中的空间，而不是符号表中的数据，因此 X 的值会改变
    cout << "x = " << x << endl;
    cout << "X = " << X << endl;
    cout << "*p = " << *p << endl; // *p = 100

    return 0;
}