求解C语言C++下const相关问题

C语言下的const

在C语言下const修饰的变量具有常属性,但仍是变量(不知道理解对不对)
无法用于创建数组


const int g_num = 5;
int main()
{
    const int num = 5; 
    int arr[num] = { 0 };  //err
    int arr2[g_num] = { 0 };  //err

    return 0;
}

在C++下const修饰的变量是常量??
可用于创建数组

const int g_num = 5;

int main()
{
    const int num = 5;
    int arr[num] = { 0 }; //ture
        int arr2[g_num] = { 0 }; //ture
    cout << arr[0] << endl;
    
    return 0;
}

用指针可以修改C下const修饰的变量,用指针不可以修改C++下const修饰的变量
查到的答案:C语言中const只表示只读,但是有自己的存储空间,所以可以用指针来修改;
C++中只在以下特定情况下分配内存,平时放在一个key和value符号表中,并且拿不到地址:

const int g_num = 5;
int main()
{
    const int num = 5;
    int* p = &num;
    *p = 10;
    printf("%d %d\n", num, *p);  //num = 10;  *p = 10;

    int* pc =&g_num;
    *pc = 100; //
    printf("%d %d\n", g_num, *pc); //err  引发了异常: 写入访问权限冲突。
    return 0;
}

```问题:为什么const 修饰的全局变量的值不可以用指针搜索,也不能用于创建数组


```c++
const int g_num = 5;

int main()
{
    const int num = 5;
    int* p = (int *) &num;
    *p = 10;
    cout << *p << endl;  //*p = 10;
    cout << num << endl; //num = 5;

    int* pc = (int*)&g_num;
    *pc = 100;
    cout << *p << endl;  //*pc = 100;
    cout << g_num << endl; //g_num = 5;

    return 0;
}

问题:C++中的const修饰的变量是否为常量,存放在全局区?

供参考:https://blog.csdn.net/tranquilllll/article/details/123590348

  • 以下回答由chatgpt基于相关博客总结生成:

    C语言和C++语言中const关键字的作用和区别是什么?

    const关键字的作用是将定义的变量指定为不可修改的常量,它可以修饰变量、指针、函数参数、成员函数等。在C语言中,const修饰的变量具有常属性但仍是变量,不能用于创建数组;在C++中,const修饰的变量则是常量,可用于创建数组。

    const修饰的变量可以存放在全局区,包括C++中。但是修改这个变量的值是非法的。

    在C语言中,用指针可以修改const修饰的变量,但不可以修改C++中const修饰的变量,因为C++中的const修饰的变量是真正的常量。

    总结: 1. C和C++中的const关键字都可以用于定义常量; 2. C中const关键字定义的变量不能用于创建数组,而C++中可以; 3. C++中const修饰的变量是真正的常量,不能被修改; 4. const修饰的变量可以存放在全局区,包括C++中。