1. 程式人生 > 其它 >const 在 C 和 C++ 中的區別

const 在 C 和 C++ 中的區別

1 C 中的 const 記憶體分配

1.1 修飾全域性變數

#include<stdio.h>

const int n = 5;

int main(){
    int* p = (int*)(&n);
    *p = 10;
    printf("%x\n", &n);
    printf("%x\n", p);
    printf("%d\n", n);
    printf("%d\n", *p);
    return 0;
}

C語言中const修飾的全域性變數分配在只讀資料區中,所以當通過指標去修改值時會發生段錯誤:

 

 

1.2 修飾區域性變數

#include<stdio.h>

int main(){
    const int n = 5;
    int* p = (int*)(&n);
    *p = 10;
    printf("%x\n", &n);
    printf("%x\n", p);
    printf("%d\n", n);
    printf("%d\n", *p);
    return 0;
}

在上面的程式碼中,const 修飾的 n 是一個區域性變數,所以分配在棧區,可以通過指標去修改其值。

 


 

 

2 C++ 中的 const 記憶體分配

在C++中,用const修飾的常量會被寫入符號表

中,如果出現了以下兩種情況,則會為它分配記憶體空間:

  1. 對 const 常量使用了 extern,需要在其他檔案中使用
  2. 對 const 常量使用了 & 操作符,要取地址
#include<iostream>

const int n = 5;

int main(){
    int* p = (int*)(&n);
    *p = 10;
    printf("%x\n", &n);
    printf("%x\n", p);
    printf("%d\n", n);
    printf("%d\n", *p);
    return 0;
}

現在這段程式碼中 n 的輸出結果依然是 5 :

但是如果 n 是一個區域性變數,n 的輸出依然是 5 ,但是  *p 的輸出會變為 10。

 

 

 

References:

  1. 【C++深度解析】2、C/C++ 中的 const
  2. const在C與C++中的區別