在C中,變數的定義主要可分為兩種狀況:在函式內和在函式外。

但變數在函式內定義時,其屬性只能分為static和無static,而該變數便無法被外部函式所引用。而定義為static時表示該變數只能用來初始化一次。

而變數在函式外定義時,其屬性也只能分為static和extern,而如果不以static來修飾變數,編譯器便會預設將該變數的屬性設為extern(等同於使用extern來定義)。

若為static,則表示該變數只能在定義的檔案裡使用,無法被別的檔案裡的程式呼叫。

關於宣告:變數的宣告預設著需要通過extern來進行宣告,而且宣告可以進行多次,而被宣告的變數應為extern屬性,即其屬性不能被宣告為static。

而宣告可以在函式內部,也可在函式外部。

1、 變數在同一個檔案裡定義

(1)變數在函式外定義

#include <stdio.h>

int i = 12;

int main()

{

       printf(“thei in the 1.c is %d\n”, i);

}

結果為

the i in the 1.c is 12.

(2)變數在函式內也定義

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

}

結果為

the i in the 1.c is 123.

對比上面可知,如果函式內定義了與函式外同一名字的變數(即函式的全域性變數和區域性變數同名),則區域性變數會覆蓋全域性變數。

(3)、變數在函式內進行extern引用

#include <stdio.h>

int i = 12;

int main()

{

       externint i;

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

}

結果為:


編譯器提示出錯,i被重複定義了。

(4)變數在函式外進行extern宣告

#include <stdio.h>

extern int i = 12;

int main()

{

       externint i;

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

}

結果:


可以發現,會有警告,其仍可執行,且結果正確。

2、 變數在多個檔案間

(1)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現在1.c中定義的i僅在1.c可用,而2.c中不可用。

(2)在1.c中:

#include <stdio.h>

extern int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


在1.c中對變數是否加extern無法影響2.c中的i。

(3)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

void a2(void)

{

extern int i;

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


(4)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i;

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


(5)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i;

void a2(void)

{

       inti = 2123;

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


(6)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i =212;

void a2(void)

{

       inti = 2123;

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現通過externint進行定義的話,會與1.c中的int i衝突而出錯。

(7)在1.c中:

#include <stdio.h>

int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

int i = 212;

void a2(void)

{

       inti = 2123;

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現如果變數在函式外定義,其預設已加上了extern。

(8)在1.c中:

#include <stdio.h>

static int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

int i = 212;

void a2(void)

{

       inti = 2123;

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


在1.c中在變數前加上static便可避免了衝突,因為static將該變數變為了區域性的變數。

(9)在1.c中:

#include <stdio.h>

static int i = 12;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i;

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現如果變數被宣告為static後,便無法通過extern來對之進行呼叫。

(10)在1.c中:

#include <stdio.h>

int main()

{

       externint i = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i;

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現函式內部的變數無法定義為extern型別。

(11)在1.c中:

#include <stdio.h>

extern int i = 1123;

int main()

{

       inti = 123;

       printf(“thei in the 1.c is %d\n”, i);

       a2();

}

       在2.c中:

extern int i;

extern int i;

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

}

結果:


可以發現,變數的宣告可以多次宣告,程式可正常執行。

(12)在1.c中:

#include <stdio.h>

extern int i = 1123;

int main()

{

       printf(“thei in the 1.c is %d\n”, i);

       a2();

printf(“the i inthe 1.c is %d\n”, i);

}

       在2.c中:

extern int i;

extern int i;

void a2(void)

{

       printf(“thei in the 2.c is %d\n”, i);

       i= 212;

}

結果:

看了一個百度知道的解釋不錯,在此附上對應網址:https://zhidao.baidu.com/question/570728680.html