const限定符和指標

來源:互聯網
上載者:User

1、指向const對象的指標;

指標指向const對象,但是指標本身是普通變數,可以修改和賦值。例如:

const  int   *   p;

這樣定義效果和上面完全一樣:

int  const * p;


這個指標p指向這樣的對象:const int,也就是說,p指向的對象是不能修改的。

*p = 23;//error: *p might be const

但是,指標p卻是可以修改的:

const  int a=2;const  int b=3;p = &a;p = &b;

還沒完,雖然p是指向const對象的,但是這隻是p自己認為自己是指向const對象的:

int  c = 4;p = &c;//ok*p = 4;//error

這裡p指向的是普通對象,但是卻不能修改p指向的值,因為p認為自己是指向const對象,是不能修改其值的。

在實際應用中,指向const的指標常用作函數的形參。將形參定義為指向const的指標,可以確保傳遞給函數的實際對象在函數中不因為形參而被修改。

這才是重點。


但是,把一個const對象的地址賦值給一個普通的、非const對象的指標是錯誤的,這會導致編譯時間錯誤:

int  * q;q = &a;// error!

2、不能使用void *指標儲存const對象的地址,而必須使用const void * 類型的指標儲存const對象的地址:

const  int   cu = 23;const  void  * p = &cu;//okvoid * q = &cu;// error

3、const指標

上面是指標可變,但是指標指向的對象不能變。

還有一種情況是指標本身不能變--const指標。

    int e = 0;    int * const p = &e;

可以這樣理解:從右向左,p是指向int型對象的const指標。因為指標是const的,所以任何企圖給const指標賦值的行為都導致編譯時間的錯誤:

p = p;// error, p is const

所以,必須在定義時初始化,否則以後就再也沒有機會了(編譯時間報錯:未初始化)。


但是,p指向的對象是普通的變數,可以修改:

*p = 45; //ok

4、更奇葩的:指向const對象的const指標:

const  double pi = 3.14159;const  double * const  pi_ptr = π

這裡,既不能修改指標pi_ptr的值,也不能修改指標pi_ptr指向的對象。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.