筆記1:C語言變量與常量

一.變量

1.1普通局部變量和全局變量的對比

1.定義同時沒有初始化,則局部變量的值是隨機的,而全局變量的值是默認爲0的。
2.使用範圍上:全局變量具有文件作用域,而局部變量只有代碼塊作用域。
3.生命週期上:全局變量是在程序開始之前的初始化階段就誕生的,到整個程序結束退出的時候才死亡;而局部變量在進入局部變量所在的代碼塊時誕生,在該代碼塊退出的時候死亡。
4.變量分配位置:全局變量分配在數據段上,而局部變量分配在棧上。

基本概念:
作用域:起作用的區域,也就是可以工作的範圍。
代碼塊:所謂代碼塊,就是用{ }擴起來的一段代碼。
數據段:數據段存的是數,像全局變量就存在數據段。(注意:全局變量纔算是程序的數據,局部變量不算程序的數據,只能算是函數的數據)
代碼段:存的是程序代碼,一般是隻讀的。
棧(stack):先進後出。C語言中的局部變量存在棧中。

注意:以下代碼編譯會出錯未定義i,i是局部變量,工作範圍是代碼塊(範圍爲{ })。

for()
{
    int i = 1;
}
printf("i:%d\n",i);

1.2靜態局部變量和全局變量

1.靜態局部變量和普通局部變量不同。靜態局部變量也是定義在函數內部,靜態局部變量定義時前面加上static關鍵字來標識,靜態局部變量所在的函數在調用多次時,只有第一次才經歷變量定義和初始化,以後多次在調用時不再定義和初始化,而是維繫之前上一次調用時執行後這個變量的值。本次接着來使用。

2.靜態局部變量在第一次函數被調用時創造並初始化,但在函數退出時它並不死亡,而是保持其值等待函數下一次被調用。下次調用時不再重新創造和初始化該變量,而是直接用上一次留下的值爲基礎來進行操作。

3.靜態局部變量的這種特性,和全局變量非常類似。它們的相同點是都創造和初始化一次,以後調用時值保持上次的不變。不同點在於作用域不同。

1.3register局部變量

寄存器局部變量,和普通局部變量差不多。C語言中最快的變量,C語言承諾register變量是放在寄存器中的,普通局部變量放在內存中的。

1.4全局變量

全局變量的定義和初始化是在main函數運行之前發生的

1.局部變量能不能跨文件使用?
不能,因爲局部變量屬於代碼塊作用域。他的作用域只有他定義的那個函數內部實現。
2.靜態局部變量能不能跨文件使用?
不能。因爲本質還是局部變量

討論跨文件使用問題,只用討論全局變量和函數就可以了。

1.4.1靜態全局變量(解決跨文件引用變量問題)

靜態全局變量就是用來解決重名問題的。靜態全局變量定義時在定義前加static關鍵字,告訴編譯器這個變量只在當前本文件內使用,在別的文件中絕對不允許使用。

1.4.2跨文件引用全局變量

函數和全局變量在C語言中可以跨文件使用,也就是說他們的連接範圍是全局的,具有文件連接屬性。

二.常量

程序運行過程中不會改變的量。常量的值在運行之前初始化的時候給定一次,以後都不會變了,以後一直是這個值。

2.1#define定義的常量

2.2const關鍵字

const和指針結合,共有四種形式
const int *p;
p是一個指針,指針指向一個int型整數,p指向的是個常量
int const *p;
p是一個指針,指針指向一個int型整數,p指向的是個常量
int *const p;
p是一個指針,指針指向一個int型整數,p本身是常量,p所指向的是個變量
int *const *p;
p是一個指針,指針指向一個int型整數,p本身是常量,p所指向的是個常量

結論和記憶方法:
1.const在*前面,表示const作用於p所指向的量。所以這時候p所指向的是個常量
2.const在*後面,表示p本身是個常量,但是p所指向的不一定是常量

const型指針有什麼用?
char *strcpy(char *dst,const char *src);
字符串處理函數strcpy,它的函數功能是把 src指向的字符串,拷貝到dst中。

2.3枚舉常量

枚舉常量是宏定義的一種替代品,在某些情況下會比宏定義好用。

發佈了70 篇原創文章 · 獲贊 21 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章