tft每日頭條

 > 生活

 > c語言函數名與變量名可以一樣嗎

c語言函數名與變量名可以一樣嗎

生活 更新时间:2025-02-08 13:55:58

局部變量和全局變量

C語言中變量按其作用域分,可分為局部變量和全局變量,具體的解釋為:

局部變量(内部變量):在定義它的函數内有效,但是函數返回後失效;

全局變量(外部變量):在所有源文件内均有效。在同源文件的函數中使用使用全局變量,需要将全局變量提前聲明;同時在不包含全局變量定義的不同源文件需要用extern關鍵字再次聲明。

關于C語言全局變量和局部變量,還有幾個注意點:

如果在該函數内定義了一個與之前定義的全局變量同名的變量,那麼該同名局部變量就會在函數内部屏蔽全局變量的影響。即當局部變量與全局變量同名時,在局部變量的作用範圍之内,全局變量不起作用。局部變量優先原則;

全局變量是有默認值的(引用類型的變量默認值都是null,基本類型的變量默認值則不一樣,int型變量默認值是0),但是局部變量沒有默認值;

全局變量可以在函數外定義并初始化,但不能進行賦值操作。這是什麼意思呢?我們看一下:

c語言函數名與變量名可以一樣嗎(C語言函數中的變量)1

此時程序運行通過,程序中a為全局變量,在函數外進行定義并初始化。

c語言函數名與變量名可以一樣嗎(C語言函數中的變量)2

此時程序運行錯誤。全局變量在函數體外隻能進行初始化,不能進行賦值運算。

c語言函數名與變量名可以一樣嗎(C語言函數中的變量)3

此時程序運行通過,C語言執行過程中,對代碼進行了優化,把程序2中的int a;a=1;優化為一句話:int a=1;這就是初始化。

變量的存儲類型

C語言中變量按其存在的時間(即生存期)分,可分為動态存儲變量和靜态存儲變量。

動态存儲變量:當程序運行進入定義它的函數或複合語句時才被分配存儲空間,程序運行結束離開此函數或複合語句時,所占用的内存空間被釋放。這是一種節省内存空間的存儲方式;

靜态存儲變量:在程序運行的整個過程中,始終占用固定的内存空間,直到程序運行結束,才釋放占用的内存空間。靜态存儲類别的變量被存放在空間的靜态存儲區。

在C語言程序運行時,占用的内存空間被分成三部分:程序代碼區、靜态存儲區、動态存儲區。

程序運行中的數據分别存儲在靜态存儲區和動态存儲區。靜态存儲區用來存放程序運行期間所占用的固定存儲單元的變量,如全局變量等;動态存儲區用來存放不需要長期占用内存的變量,如局部變量等。

變量的存儲類型具體來說分成4種:自動類型(auto)、寄存器類型(register)、靜态類型(static)、外部類型(extern)。其中,自動類型、寄存器類型的變量屬于動态變量,靜态類型、外部類型屬于靜态變量。

自動變量(auto)

自動類型是C語言程序中使用最廣泛的一種類型。函數中的局部變量,如果不專門聲明為static存儲類型,都是動态分配存儲空間的,數據存儲在動态存儲區。函數中的形參和函數中定義的變量都屬于此類。在調用這些函數時,系統會給它們分配存儲空間,在函數調用結束後就自動釋放這些存儲空間。

C語言規定:函數内凡未加存儲類型說明的變量均視為自動變量,也就是說,自動變量可省略說明符auto,說明符auto不寫則隐含表示該變量為自動存儲類型的。

對于自動變量來說,如果不賦初值,它的值是一個不确定的值。

自動變量的一般形式為:

{

(auto) 類型 變量名;

}

靜态變量(static)

靜态變量存儲在靜态存儲區,用static關鍵字來聲明。屬于靜态存儲方式,又可分成靜态全局變量和靜态局部變量。

C語言規定:靜态變量(包括靜态局部變量、靜态全局變量)有默認值,int型等于0,float型等于0.0,char型等于'\0'。而自動變量和寄存器變量沒有默認值,是随機值。

靜态局部變量:隻在定義它的函數内有效。隻是程序僅分配一次内存,函數返回後,該變量不會消失,隻有程序結束後才會釋放内存;

靜态全局變量:隻在定義它的文件内有效,且生存期在整個程序運行期間。

靜态變量的一般形式為:

static 類型 變量名;

{

static 類型 變量名;

}

c語言函數名與變量名可以一樣嗎(C語言函數中的變量)4

static關鍵字的作用:

在函數體中,一個被聲明為靜态的變量在這一函數被調用過程中隻會被分配一次内存,且整個運行期間不會重新分配;

在函數體外、某個源文件内,一個被聲明為靜态的變量隻可被該源文件内的所有函數訪問,但不能被其他源文件的函數訪問。它是一個本地的全局變量;

在某個源文件内,一個被聲明為靜态的函數僅僅隻可以被這個源文件的其它函數調用。也就是說,這個函數被限制在聲明它的源文件的本地範圍之内使用。

也就是說,static的作用主要體現在兩點上:

對于局部變量而言,加上static,就将數據保存到靜态存儲區,僅分配一次内存,生存期大大加強(改變存儲區域);

對于全局變量而言,由于本身已經在靜态存儲區,加上static,就将變量作用域限制到定義它的源文件内(改變作用域)。

對于函數也是一樣,限制範圍。而不限制全局變量和函數範圍的時候,其他源文件需要引用的時候,都需要extern關鍵字。

寄存器變量(register)

除了常用的自動變量和靜态變量之外,C語言還提供了一種幫助程序員利用CPU寄存器的方法。使用關鍵字register來聲明局部變量時,該變量即稱為寄存器變量。寄存器變量是動态局部變量,存放在CPU的寄存器或動态存儲區中,該類變量的作用域、生存期和自動變量相同。如果沒有存放在寄存器中,就按自動變量處理。

寄存器變量的好處是:寄存器的存儲速度比内存快得多。但是由于現在編譯系統的優化,使得編譯器可以自動識别頻繁使用的變量,并自動将其存儲在寄存器中,故而現在寄存器變量的定義是不必要的。

寄存器變量的一般形式為:

{

register 類型 變量名;

}

register由于是在寄存器(動态存儲區)中,所以,寄存器變量不可能同時又是全局變量或者靜态變量!

外部變量(extern)

外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程序文件的末尾。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

在一個文件中定義的全局變量默認為外部的,即關鍵字extern可以省略,但如果在其他的文件中使用這個文件定義的全局變量,則必須在使用前用extern進行外部聲明。

外部變量的一般形式為:

extern 類型 變量名;

extern關鍵字的作用:

在本文件範圍内擴展外部變量的作用域;

将外部變量作用域擴展到其他源文件中。

最後,如果你想學C/C 可以私信小編“01”獲取素材資料以及開發工具和聽課權限哦!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved