C語言基礎知識——define、static、const
阿新 • • 發佈:2018-12-01
**1、**使用巨集函式的程式舉例:
#include <stdio.h> #define PI 3.14 #define ADD(x, y) (x+y) #define MAX(x, y) ((x>y)?(x):(y)) int add(int x, int y) { return x+y; } int main() { printf ("%d\n", ADD(1,2)); printf ("%d\n", add(1,2)); printf ("%d\n", ADD(1,2)*ADD(3,4)); printf ("%d\n", add(1,2)*add(3,4)); return 0; }
使用巨集函式的優缺點:
I、避免了函式的入棧、出棧、跳轉等過程,提高了程式的執行效率
II、多次呼叫,會使程式碼變得龐大
**2、**變數分類:
從空間:全域性變數、區域性bl
從時間:
I、靜態儲存方式
II、動態儲存方式
a、函式形式引數。在調函式時給形參分配儲存空間。
b、函式中定義的沒有用關鍵字static宣告的變數,即自動變數。
c、函式呼叫時的現場保護和返回地址等。
**3、**在C語言中,每個變數和函式都有兩種屬性:資料型別、資料的儲存類別。
C的儲存類別包括四種:自帶的(auto)、靜態的(static)、暫存器的(register)、外部的(extern)。
static:
I、修飾區域性變數:可以延長區域性變數的生命週期,直到程式結束時才會被釋放。
II、修飾全域性變數:只能在本檔案中使用,其它檔案不可用。
III、修飾函式:只能在本檔案中使用,其它檔案不可用。
使用static變數的程式:
#include <stdio.h> //extern-變數宣告 //在此檔案中可引用另一個檔案中定義的外部變數“gt” extern int gt; void func() { static int a = 10; a++; printf ("a = %d\n", a); } int main() { int i; for (i = 0; i < 10; i++) { func(); } printf ("gt = %d\n", gt); //直接編譯此“.c”檔案時會報錯。 //另新建一“.c”檔案,並在其中定義了“int gt=10”,並且與此檔案共同編譯時,即可得“gt=10”。 //另新建一“.c”檔案,並在其中定義了“static int gt=10”,再與此檔案共同編譯時,會報錯。因為經static修飾的全域性變數,只能在本檔案中使用,其它檔案不可用。 printf ("1 + 2 = %d\n", add(1, 2)); return 0; }
**4、**const作用
/*
const:修飾變數,將變數變成只讀屬性
不能通過修飾的變數名改變變數空間的值
只是不能通過修飾的變數改變空間的值,
不代表空間的值不能改變
看const修飾的物件:
將變數型別去掉後,離const最近的就是其所修飾的
*/
#include <stdio.h>
int main()
{
int a = 10;
const int *p1 = &a;
/*
const *p1 = &a——修飾*,
不能通過*改變指向的空間的值,
可理解為 *p1 不能變。
int b = 20; p1 = &b; ==>合法
*p1 = 20; ==>非法
*/
int const *p2 = &a;
//const *p2 = &a——同上
int *const p3 = &a;
/*
const p3 = &a——指標指向不能變,
p3不能變,可以通過p3改變指向空間的值
int b = 20; p2 = &b; ==>非法
*p1 = 20; ==>合法
*/
const int *const p4 = &a;
/* const *const p4 = &a——指標指向不能變,
指向的空間也不能變
*/
return 0;
}