原題是一個代碼語言題,然後問是否報錯以及會輸出什麼。
這也是一個朋友去參加校招的一個簡單筆試題。
剛好我幾個禮拜前無聊看了本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;固定不能改。