C語言中const關鍵相關問題

一、const修飾的變量html

    const修飾的變量是不能經過變量再次賦值而改變。 ios

1 int main{
2        char buf[4];
3        const int a = 0;  //a不可改變
4       a = 10;          //error 
5 } 
View Code

  這個比較容易理解,編譯器直接報錯,緣由在於「a = 10;」這句話,對const修飾的變量,後面進行賦值操做。程序員

 

int main{ char buf[4] = {0}; const int a = 0; buf[4] = 97;   //越界操做
    printf(「the a is %d\n」,a); }

 

  若是const修飾的是變量是不能被修改的話,那麼a的值必定不會改變,確定仍是0。可是在實際運行的結果中,咱們發現a的值已經變爲97了。這說明const修飾的變量a,已經被咱們程序修改了。數組

  第一個例子,錯誤是在程序編譯的時候給出的,注意這裏,這個時候並無生成可執行文件,說明const修飾的變量能否修改是由編譯器來幫咱們保護了。而第二個例子裏,變量的修改是在可執行程序執行的時候修改的,說明a仍是一個變量。const修飾的變量,其實質是告訴程序員或編譯器該變量爲只讀,若是程序員在程序中顯示的修改一個只讀變量,編譯器會絕不留情的給出一個error。而對於因爲像數組溢出,隱式修改等程序不規範書寫形成的運行過程當中的修改,編譯器是無能爲力的,也說明const修飾的變量仍然是具有變量屬性的。ide

  綜上說明,const修飾變量沒有改變變量表明的存儲區自己的屬性,只是從編譯器層面進行了優化,被const修飾的變量不是常量。優化

    另外const也不會修改變量的生命週期和做用於。spa

二、const修飾的幾種形式 指針

const int a = 5;  <==>  int const a = 5; const int *p = &i;  //const修飾的對象爲*p,即變量i不可變,p可變
const (int*) p = &i; //const修飾的對象爲p,p只能指向變量i的存儲區,i可變
int * const p = &i;   //同上
------------------------------------------------------------------ typedef int * p_int; const p_int p = &i;  //此時const修飾的是p,p不可變,i可變 

三、修改const修飾的變量的值code

1)修改只讀常量 #include <stdio.h>
int main(void){ const i = 5; int *p = (int *)&i; *p = 6; printf("%d\n", i); return 0; } 2)修改指針常量 #include <stdio.h>
int main(void){ i = 5; const int *p = &i; int *q = p; *q = 6; printf("%d\n", *p); return 0; } 3)修改常量指針 #include <stdio.h>
int main(void){ int i = 5; int j = 6; const int *p = &i; printf("%p\n", p); int **q = (int **)&p; *q = &j; printf("%p\n", p); return 0; }

 四、編譯器對對const修飾的變量進行優化htm

#include<iostream>
using namespace std;
int main(void){
    const int a=10;
    const int * p=&a;                    //讓指針p指向常量a所在的內存
    int * pa=const_cast<int *>(p);         //強制轉換const指針爲非const
    *p_var=20;                //往該指針所指向的內存寫20,也就是把10給覆蓋了
    
    cout << "a=" << a << endl;
    cout << "&a=" <<&a <<endl;
    
    cout << "*p=" <<*p << endl;
    cout << "p=" << p << endl;
    
    cout << "*pa" << *pa<< endl;
    cout << "pa=" << pa << endl;
  
    return 0;
}

 http://www.cnblogs.com/TaigaCon/archive/2012/12/19/2824355.html

相關文章
相關標籤/搜索