深入理解C語言 static、extern與指標函數
這篇文章主要介紹了C語言 static、extern與指標函數,有需要的朋友可以參考一下
1.exit(0)正常退出程式
exit(1)程式異常時退出程式
2.static(靜態變數)修飾局部變數
在局部變數使用static修飾,會延長局部變數的存在期。但我們需要注意一下幾點:
•雖然static修飾變數的生存期很長,但它始終是局部變數,不能在其他函數中使用
•static全域變數與普通的全域變數有什麼區別?static局部變數和普通局部變數有什麼區別?static函數與普通函數有什麼區別?
全域變數(外部變數)的說明之前再冠以static 就構成了靜態全域變數。全域變數本身就是靜態儲存方式, 靜態全域變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域變數的範圍是整個來源程式, 當一個來源程式由多個源檔案組成時,非靜態全域變數在各個源檔案中都是有效。 而靜態全域變數則限制了其範圍, 即只在定義該變數的源檔案內有效, 在同一來源程式的其它源檔案中不能使用它。由於靜態全域變數的範圍局限於一個源檔案內,只能為該源檔案內的函數公用, 因此可以避免在其它源檔案中引起錯誤。
從以上分析可以看出, 把局部變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域變數改變為靜態變數後是改變了它的範圍, 限制了它的使用範圍。
static函數與普通函數範圍不同。僅在本檔案。只在當前源檔案中使用的函數應該說明為內建函式(static),內建函式應該在當前源檔案中說明和定義。對於可在當前源檔案以外使用的函數,應該在一個標頭檔中說明,要使用這些函數的源檔案要包含這個標頭檔
static全域變數與普通的全域變數有什麼區別:static全域變數只初使化一次,防止在其他檔案單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝
3.extern(外部變數) 修飾全域變數
extern 不但可以修飾變數還可以修飾函數
全域變數範圍已經很廣了,為什麼還要用extern來修飾呢?看下面一個例子
代碼如下:
#include "stdio.h"
void main()
{
extern a;
extern b;
printf("a=%d,b=%d",a,b);
}
int a=13,b=5;
上面例子中,在定義了a,b之前就使用它,也就是說extern擴充了全域變數的作用範圍。
extern不僅上邊例子這種用法,在不同檔案中的全域變數也可以使用extern來使用。
4.指標函數
定義:指標函數就是函數類型和傳回值都是指標的函數。
指標函數的一般形式:
類型 *函數名(參數列表)
下面用一個例子來體會一下指標函數的妙用吧
代碼如下:
/* Note:Your choice is C IDE */
#include "stdio.h"
char * SubString(char s[],int i,int j);
char *SubString1(char s[] ,char temp[], int i,int j);
void main()
{
char string[]="I Love C Language";
char *ps=NULL;
char temp[100];
ps=SubString(string,2,9);
printf("%sn",ps);
SubString1(string,temp,2,9);
printf("%sn",temp);
}
char * SubString(char s[],int i,int j)
{
static char temp[100];/*這個地方聲明的臨時數組必須為static,否則值傳不會去*/
int m,n;
for(m=0,n=i;n<=j;m++,n++)
{
temp[m]=s[n];
}
temp[m]='';
return temp;
}
char *SubString1(char s[] ,char temp[], int i,int j)
{
int m,n;
for(m=0,n=i;n<=j;m++,n++)
{
temp[m]=s[n];
}
temp[m]='';
}