C語言中那些你必須知道的常用關鍵字
1. C/C++中內(nèi)存大致分的三個區(qū)域
棧區(qū)(stack):由編譯器自動分配釋放。
存放 :局部變量、形參、返回值。
堆區(qū) (heap): 由程序員分配內(nèi)存和釋放。
調(diào)用函數(shù) :malloc() free()等。
靜態(tài)區(qū) :通常是用于那些在編譯期間就能確定存儲大小的變量的存儲區(qū),全局變量和 靜態(tài)變量。
2. 關鍵字static
在C語言中:
static是用來修飾變量和函數(shù)的
1. 修飾局部變量-稱為靜態(tài)局部變量
2. 修飾全局變量-稱為靜態(tài)全局變量
3. 修飾函數(shù)-稱為靜態(tài)函數(shù)
靜態(tài)局部變量
示例:
大家來來看這段代碼
局部變量a,在沒有static
修飾之前局部變量a是存放在棧區(qū)的。所以每次出局部范圍就銷毀(把空間還給操作系統(tǒng))。然后,調(diào)用時重新創(chuàng)建初始化。
那我們把局部變量a加上static關鍵字修飾成靜態(tài)局部變量,會怎么樣呢?
//static 修飾局部變量的時候 //本來一個局部變量是存放在棧區(qū)的,如果被static修飾就存儲到靜態(tài)區(qū)了 //static 修飾局部變量改變了變量的存儲類型(位置),使得這個靜態(tài)變量的生命周期變長了,直到程序結束才結束 //但是作用域不變 void test() { static int a = 5;//靜態(tài)變量的 a++; printf("%d ", a); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
這里static
關鍵字把變量a修飾成了靜態(tài)變量
,所以變量 a a a 本來是存放在棧區(qū)的,但是由于被修飾成靜態(tài)變量所以被存放在靜態(tài)區(qū)
了。
靜態(tài)區(qū)變量的特點:
創(chuàng)建好后,直到程序結束才銷毀
這里說明了:靜態(tài)變量a在程序編譯的時候就自動創(chuàng)建好了,并且已經(jīng)完成初始化了
而沒有修飾呢:
沒有修飾之前必須進入函數(shù)體中初始化語句才會完成初始化。
靜態(tài)局部變量的作用域和生命周期
前面我們說了靜態(tài)變量是創(chuàng)建完成后,直到程序結束才銷毀。
所以,靜態(tài)變量的生命周期是整個工程。
而靜態(tài)局部變量的作用域呢?
雖然我們把變量a修飾成了靜態(tài)局部變量但是他本質(zhì)上還是個局部變量
所以他的作用域不變還是它所在的局部范圍
靜態(tài)全局變量
我們都這樣全局變量的作用域是
整個工程
可以看到只要在一個工程內(nèi),不同.c
文件之間只要(聲明)也可以調(diào)用。
說明:全局變量具有外鏈接屬性。
但是我們用static關鍵字修飾成靜態(tài)全局變量看看
說明:static 修飾全局變量
- 改變了這個全局變量的鏈接屬性,由外邊鏈接屬性變成了內(nèi)部鏈接屬性
- 就是這個靜態(tài)變量只能在自己所在的源文件內(nèi)部使用,不能在其他源文件內(nèi)部使用了
- 感覺像是作用域變小了
靜態(tài)函數(shù)
static修飾函數(shù)和修飾全局變量是一樣
用static修飾函數(shù)了之后
說明:用static修飾函數(shù)
- static 修飾函數(shù)和static修飾全局變量是一樣的
- 函數(shù)是具有外部鏈接屬性的,但是被static修飾,就變成了內(nèi)部鏈接屬性
- 使得這個函數(shù)只能在自己所在的源文件內(nèi)部使用,不能在其他文件內(nèi)部使用的
3.#define 定義常量和宏
#define 定義常量
#define M 100 int main() { int arr[M] = {0};//100*4 = 400 int m = M; printf("%d\n", sizeof(arr));//400 printf("%d\n", M); printf("%d\n", m); return 0; }
這里#define 定義的是M這個標識符常量
- 以后我們在碰到
M
的時候編譯器在編譯期間,就會自動替換為常量100
。 - 通常在定義數(shù)組時使用或者重復值時。
#define 定義宏
我們來看一下宏是怎么定義的:
和定義函數(shù)非常相識
但是宏沒有函數(shù)的返回類型和參數(shù)類型
還是很不一樣的,宏的實現(xiàn)體一般都是表達式
那么宏是怎么調(diào)用的呢?和函數(shù)有什么區(qū)別嘞?
//宏 #define ADD(x, y) ((x)+(y)) //函數(shù) int Add(int x, int y) { return x + y; } int main() { int a = 10; int b = 20; int c = ADD(a, b); //int c = (a)+(b); printf("%d\n", c); int d = Add(a, b); printf("%d\n", d); return 0; }
我們可以看到宏的調(diào)用也和函數(shù)產(chǎn)不多,但是
int c = ADD(a, b);這段代碼調(diào)用宏的本質(zhì)是替換
int c = (a)+(b);在編譯的時候就把ADD這個宏替換成這樣
而函數(shù)調(diào)用是
把實參傳到函數(shù)形參里面進行計算,然后在返回值
4.關鍵字 typedef
typedef 顧名思義是類型定義,這里應該理解為類型重命名。
示例:
//將unsigned int 重命名為uint_32, 所以uint_32也是一個類型名 typedef unsigned int uint_32; int main() { //觀察num1和num2,這兩個變量的類型是一樣的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; }
到此這篇關于C語言中那些你必須知道的常用關鍵字的文章就介紹到這了,更多相關C語言關鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解
遺傳算法起源于對生物系統(tǒng)所進行的計算機模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動獲取和積累有關搜索空間的知識,并自適應地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下2022-09-09