C中一個面試題:指標常量和常量指標的問題

來源:互聯網
上載者:User

原題是一個代碼語言題,然後問是否報錯以及會輸出什麼。

這也是一個朋友去參加校招的一個簡單筆試題。

剛好我幾個禮拜前無聊看了本C編程入門書籍,鞏固下。

從變數的範圍方面來看一遍

1.static 變數只被初始化一次

這個對於把變數放在全域中比較好瞭解。

但是比如放在了方法了

void Scope_Test()

{

    static int a = 0;

    static int b;

   

    b = 1;

   

    printf("a= %d和 a的地址 %p--b = %d和b的地址%p\n",a++,&a,b++,&b);

}

因為以前我們剛看對於申明變數和初始設定變數時瞭解到

int a = 2;//申明 然後初始化a = 2;

和int 2;a = 2;//同上

感覺上是等價的。

但是通過上面的方法測試後發現輸出是

a= 0和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 1和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 2和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 3和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 4和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

(測試時將該方法執行了多次)

通過log發現對於static 類型的a變數的值的改變是符合我們的理解的。

但是對於b發現一直是1.

然後自己琢磨下,int b;和 b = 1; 其實是兩條語句操作。

c語言對於申明 int b;但是沒有緊接著當前語句的初始化操作時,自動初始化成了0.

在執行第二條語句 b = 1;其實是個賦值過程了。

因此當我我們看到上面的輸出時,通過地址輸出就可以看出,並不是b又被初始化了,只是每次調用都被重新賦值

為1而已。

2.指標常量和指向常量的指標。

const int *p和int *const p;

前者是表示指向常量的指標,既我們不能通過指標來改變指標指向的變數的值

比如

    int a = 3   ;

    const int *b;

    b = &a;

    (*b) = 4;//編譯器會報錯,提示a是唯讀。

但是我們可以給b重新賦值

     int c = 9;

     b = &c;

後者表示的是指標p是個常量,既p被初始化後就不能改變

     int a = 3;

      int *const b = &a;

    (*b) = 4;

 這邊再提到個小問題。

如果寫成

int *const b;

b = &a;

同樣是報錯的。這個解釋和上面提到的申明和初始化的理解應該是一樣的。

申明後自動初始化了,第二句語句是執行了二次賦值,常量不能被重複賦值。

因此記得書上也提到過,常量的申明必須給其初始化賦值,反之你想稍後給其賦值,

但是系統已經給其初始化了,就無法進行你要的賦值操作,常量定義的也就失去了你要表達的意義

當然最後還有種變態標記法是

const int *const p;固定不能改。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.