目錄
關鍵字static
#define 定義常量和宏
粗略講解資料的儲存
源檔案變成可執行檔案的大概程序
資料的儲存
在記憶體大致可以分為
堆疊區,堆區,靜態區
堆疊區(儲存區域變數,函式形參)
堆區(動態記憶體的儲存)
靜態區(儲存靜態變數,全域變數)
其中靜態區資料的生命周期為整個程式的生命周期
源檔案變成可執行檔案的大概程序
源檔案——預處理——編譯——匯編——鏈接——可執行檔案
1.static (靜態的意思)可以修飾區域變數,全域變數,函式,
修飾區域變數(可以使區域變數的生命周期變長)(本質上是改變了資料儲存的位置,從堆疊區變到了靜態區,資料出了它的作用域不被銷毀)
如:
#include <stdio.h>
void test()
{
static int a=1;//此處a為區域變數
a++;
printf("a=%d\n",a);
}
int main()
{
int i=0;
while(i<5)
{
test();
i++;
}
return 0;
}
輸出的結果是a=2,3,4,5,6,如果把static去掉則輸出的結果是:2,2,2,2,2,
所以說明static修飾區域變數時使區域變數的生命周期變長了,
2,修飾全域變數 (改變了全域變數的作用域——讓靜態的全域變數只能在它自己的源檔案中使用,出了該檔案在另一個源檔案中就不能使用)(本身全域變數是由外部鏈接屬性的,但被static修飾之后不具備外部鏈接,變成了內部鏈接屬性,其只能在自己的源檔案中進行使用,在另一個源檔案中無法使用)
如:
一個檔案
#include <stdio.h>
int main()
{
extern int a;
printf("%d\n", a);
return 0;
}
另一個檔案
?
static int a = 10;
?
編譯器會報錯,但如果去掉static則可以編譯成功,列印的結果為10.
修飾函式:改變了函式的鏈接屬性
(static修飾函式與修飾全域變數差不多,會使外部鏈接屬性變成內部鏈接屬性)
如:檔案1
#include <stdio.h>
int main()
{
extern sum();
int c = 0;
c = sum(3, 6);
printf("c=%d\n", c);
return 0;
}
檔案2
static int sum(int a, int b)
{
int z = 0;
z = a + b;
return z;
}
其中運行程序中會報錯,就是上面我說的改變了檔案的鏈接屬性;但是如果去掉static則可以運行,
#define 定義常量和宏
#define 定義常量在前面的博客中已經提過
這是一般的定義函式
//這是一般的定義函式
#include <stdio.h>
int MAX(int x, int y)
{
if (x>y)
return x;
else
return y;
}
int main()
{
int a=10,b=11;
int c = MAX(a,b);
printf("c=%d\n", c);
return 0;
}
這是#define 的宏
#include <stdio.h>
#define MAX(x,y) (x>y?x:y)
int main()
{
int a = 10, b = 11;
int max = MAX(a, b);
printf("max=%d", max);
return 0;
}
注意define 并不是關鍵字,它是預處理指令
預處理指令從#開始
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/390390.html
標籤:其他
