1. 程式人生 > >C語言基礎知識——define、static、const

C語言基礎知識——define、static、const

**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;
}