C語言中static與sizeof查缺補漏篇
2022-07-08 14:08:08
前言
最近學習遇到了很多小難題,今天這篇部落格就來記錄一下最近學習所遇到的一些困惑我的地方,以便於複習。
一、關於關鍵字static
在C語言中:
static是用來修飾變數和函數的
- 修飾區域性變數-稱為靜態區域性變數
- 修飾全域性變數-稱為靜態全域性變數
- 修飾函數-稱為靜態函數
下面我們用程式碼來解釋一下static在c語言中的應用
1.static修飾區域性變數
//第一組程式碼 #include <stdio.h> void test() { int i = 0; i++; printf("%d ", i);//1 1 1 1 1 1 1 1 1 1 } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; } //第二組程式碼 #include <stdio.h> void test() { //static修飾區域性變數 static int i = 0; i++; printf("%d ", i);//1 2 3 4 5 6 7 8 9 10 } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
程式碼一:輸出為 1 1 1 1 1 1 1 1 1 1
程式碼二:輸出為 1 2 3 4 5 6 7 8 9 10
所以static修飾區域性變數改變了變數的生命週期,讓靜態區域性變數出了作用域依然存在,到程式結束,生命週期才結束。 簡單來說就是static把原本在棧區上的區域性變數挪到了靜態區,即 可以使變數出了作用域之後不銷燬。
2.static修飾全域性變數
在這裡我們需要在一個工程裡面開闢2個.c檔案,方便我們更清晰的看出static的作用
//程式碼一 //add.c int g_val = 2018; //test.c int main() { printf("%dn", g_val);//2018 return 0; } //程式碼2 //add.c static int g_val = 2018; //test.c int main() { printf("%dn", g_val);//會報錯 return 0; }
程式碼一:輸出 2018
程式碼二:在編譯的時候會出現連線性錯誤
所以我們可以得出結論 :一個全域性變數被static修飾,使得這個全域性變數只能在本原始檔內使用,不能在其他原始檔內使用。
3.static修飾函數
我們也需要在一個工程內開闢2個.c檔案方便我們觀察
//程式碼1 //add.c int Add(int x, int y) { return x+y; } //test.c int main() { printf("%dn", Add(2, 3));// 5 return 0; } //程式碼2 //add.c static int Add(int x, int y) { return c+y; } //test.c int main() { printf("%dn", Add(2, 3));//報錯 return 0; }
程式碼一:輸出 5
程式碼二:在編譯的時候會出現連線性錯誤
所以一個函數被static修飾,使得這個函數只能在本原始檔內使用,不能在其他原始檔內使用。
二、sizeof和strlen的區別
我們首先必須知道sizeof是關鍵字!!
strlen是函數!! 兩者有著質的區別
1.sizeof
在c語言中,sizeof在標頭檔案中的型別為unsigned int ,
他的引數可以是指標、陣列、型別、物件、函數等等
2.strlen
在c語言中,strlen()是函數,所以在使用它的時候,就有對應的標頭檔案 <string.h> ,他和sizeof在引數上不同的是,strlen的引數只有字元型指標。
二者區別
二者計算指標長度
眾所周知字串陣列後面會預設有 ‘