『壹』 c語言中 自動變數 靜態變數 寄存器變數 外部變數 有可比性嗎區別在哪簡單易懂點吧~
c語言中變數分為四類,分別是
1.auto 自動變數
2.static 靜態存貯分配變數(又分為內部靜態和外部靜態)
3.extern 外部變數/全程變數(用於外部變數說明)
4.register 寄存器變數(分配在硬體寄存器中)
四大類,所有變數必須先說明(定義),後使用。
下面分別介紹
1.自動變數(局部變數)
局部變數:在一個函數開頭或段開頭處說明的變數,
它有幾個特徵,,
a、作用域為定義它的函數
b、編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
c、形參是自動變數,作用域僅限於相應函數內
d、自動變數隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
2.外部變數:在函數外部定義的變數即為外部變數,它的作用域是整個程序(全程變數)。
a. c程序可以分別放在幾個文件上,每個文件可以作為一個編譯單位分別進行編譯。外部變數只需在某個文件上定義一次,其它文件若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。
b. 在同一文件中,若前面的函數要引用後面定義的外部(在函數之外)變數時,在函數里加extern加以說明。
引進外部變數的原因:解決函數單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決數據共享;
注意:函數本身也被認為是外部變數
3.靜態變數:分為內部靜態變數和外部靜態變數
內部靜態變數:a.在局部變數前加上static就為內部靜態變數
b.靜態局部變數仍是局部變數,其作用域仍在定義它的函數范圍內,但它採用靜態存貯分配(由編譯程序在編譯時分配,而一般的自動變數和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變數並不撤銷,再次調用時,其值將繼續存在。
外部靜態變數:a.在函數外部定義的變數前加static即為外部靜態變數
b.作用域為定義它的文件,即成為該文件的私有變數,其他文件上的函數一律不得直接訪問,除非通過它所在文件上的函數進行操作,這可實現數據隱 藏。
4.寄存器變數:只有自動(局部)變數和函數參數才能進一步指定為寄存器存貯類
a.使用register變數可以提高存取速度,但寄存器變數的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指針類型用寄存類。
c.不能對register變數取地址(即&操作)
『貳』 C語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍
在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(2)c語言中第三方變數的優缺點擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型
『叄』 C語言的指針有什麼優缺點
1、指針的優點
是標識一塊內存。電腦內存上的每一個位元組都具有一個編號,稱為地址(可以簡單理解為指針),任何讀寫內存的指令都必須攜帶地址信息,否則電腦不知道讀寫那塊內存。
不管程序是用什麼語言寫的,要運行數據和代碼必須駐留內存,CPU要執行指令必須有一個「指針」程序計數器指向內存的代碼塊,如果某個指令要操作內存數據,該指令必須攜帶額外的地址信息。
2、指針的缺點
指針可以操作任何東西,所以指針很靈活、很強大,但也引入了復雜性。
(3)c語言中第三方變數的優缺點擴展閱讀
1、指針利用地址,它的值直接指向(pointsto)存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。
2、輸出一串字元時,只需要知道它的第一個字元的地址,就可以將這個字元串輸出,而第一個字元的地址,可以用指針儲存。所以有n個字元串時,就可以用n個指針來儲存。
3、為了保存一個數據在內存中的地址,就需要指針變數。因此指針是程序數據在內存中的地址,而指針變數是用來保存這些地址的變數。
『肆』 一道c語言解答函數返回多個值,用全局變數,傳址參數,和返回結構體變數,他們之間的優缺點在哪,求解答
全局變數:
優點:變數在各個函數間自由調用和賦值,不需要考慮各個函數直接的傳值問題,程序簡單。
缺點:①資源佔用多;②函數的移植性差;③全局變數用的多容易混,程序員記憶量大,有時需要列一個變數表。
結構體變數:
優點:方便。
缺點:使用范圍受限,如果幾個返回值正好是某個已有結構體變數的內容,那才是不二的選擇。如果單獨為了返回幾個值而定義一個結構體變數,則得不償失,增加編程的工作量。所以這個方法用的少。
傳值參數(指針):
優點:用傳值參數(指針)回傳返回值是最常用的方法,需要哪一個值回傳,就定義哪一個變數的指針,用完就把內存收回來了,執行速度快,程序直觀,函數的移植性好。
缺點:要熟悉指針的使用,別搞亂套。定義指針,增加了一些工作量。
『伍』 C語言中全局變數的優缺點
以下純屬自己在這兩年來學習c語言、JAVA的觀點:
全局變數對於編程來說使用起來最方便,隨時可以調用它的值,且改變它的值,使用起來方便快捷;
但是也有它的缺點:自這個程序開始運行起,這個全局變數的空間就被申請,直到整個程序運算結束時,空間才會被釋放,若是局部變數(以c語言為例)在一個函數中的變數,在進入這個函數時,該函數中的變數空間被申請,結束函數時,這些變數的空間被釋放,有利於提高內存空間的利用率;
當全局變數是二維數組或多維數組時,申請為全局變數就不能及時釋放空間,佔用較大:如迷宮問題 用一個二維乃至多維數組存儲迷宮信息,申請全局變數時佔用的空間較大(但是用起來是真的方便,/笑); (我這兒並不是叫你迷宮問題不要申請全局變數的二維數組哈)
一般將在一個程序中經常會用到的變數或數據存儲為全局變數,使用一次或幾次就丟的數據一般在具體函數中定義。
觀點不一定正確,但希望有用。
『陸』 c語言中uint和uchar定義的變數有什麼不同,各有什麼優缺點
u是unsigned的縮寫,uint是佔2位元組,uchar佔1位元組,uchar聲明的變數能存的位元組數肯定比uint少。
無符號版本和有符號版本的區別就是無符號類型能保存2倍於有符號類型的正整數數據,比如16位系統中一個int能存儲的數據的范圍為-32768~32767,而unsigned能存儲的數據范圍則是0~65535。
『柒』 C語言跟其他編程語言有什麼不同,各有什麼優缺點
C語言跟別的語言比 是最基礎的,學單片機就是要先好C語言,C語言|優缺點&結構特點 優點1. 簡潔緊湊、靈活方便C語言一共只有32個關鍵字,9種控制語句,程序書寫形式自由,主要用小寫字母表示。它把高級語言的基本結構和語句與低級語言的實用性結合起來。 C 語言可以像匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元。 2. 運算符豐富 C語言的運算符包含的范圍很廣泛,共有34種運算符。C語言把括弧、賦值、強制類型轉換等都作為運算符處理。從而使C語言的運算類型極其豐富,表達式類型多樣化。靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。 3. 數據結構豐富 C語言的數據類型有:整型、實型、字元型、數組類型、指針類型、結構體類型、共用體類型等。能用來實現各種復雜的數據結構的運算。並引入了指針概念,使程序效率更高。另外C語言具有強大的圖形功能,支持多種顯示器和驅動器。且計算功能、邏輯判斷功能強大。 4. C是結構式語言 結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。 5. C語法限制不太嚴格,程序設計自由度大 雖然C語言也是強類型語言,但它的語法比較靈活,允許程序編寫者有較大的自由度。 6. C語言允許直接訪問物理地址,可以直接對硬體進行操作 由於C語言允許直接訪問物理地址,可以直接對硬體進行操作,因此它既具有高級語言的功能,又具有低級語言的許多功能,能夠像匯編語言一樣對位、位元組和地址進行操作,而這三者是計算機最基本的工作單元,可用來寫系統軟體。 7. 生成目標代碼質量高,程序執行效率高 一般只比匯編程序生成的目標代碼效率低10へ20%。 8. C語言適用范圍大,可移植性好 C語言有一個突出的優點就是適合於多種操作系統,如DOS、UNIX;也適用於多種機型。C語言具有強大的繪圖能力,可移植性好,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫,它也是數值計算的高級語言。 缺點1. C語言的缺點主要表現在數據的封裝性上,這一點使得C在數據的安全性上有很大缺陷,這也是C和C++的一大區別。 2. C語言的語法限制不太嚴格,對變數的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。從應用的角度,C語言比其他高級語言較難掌握。 [C語言指針] 指針是C語言的一大特色,可以說是C語言優於其它高級語言的一個重要原因。就是因為它有指針,可以直接進行靠近硬體的操作,但是C的指針操作也給它帶來了很多不安全的因素。C++在這方面做了很好的改進,在保留了指針操作的同時又增強了安全性。Java取消了指針操作,提高了安全性,適合初學者使用。 結構特點1.一個C語言源程序可以由一個或多個源文件組成。 2.每個源文件可由一個或多個函數組成。 3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。 4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。 5.每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。 6.標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。 願對你有所有幫助
『捌』 C語言定程序中義全局變數的好處壞處
好處是:便於傳遞參數,數據能在整個程序中共享。不用很麻煩的傳遞參數,也省去了傳遞參數的時間,會減少程序的運行時間。
壞處是:全局變數不好控制,不利於程序的結構化,因為程序中所有的函數都可以隨便的修改全局變數,可能導致不可預測的錯誤,也不便於調試。另外由於全局變數可能會於局部變數沖突,導致程序混亂。
因此一般的建議是盡量不用或少用局部變數。
『玖』 c語言中的變數能幫助我們解決什麼問題
和運算方式,這樣編譯程序就可以分配內存的大小和位置。比如你聲明一個 int 類型的變數,編譯程序就知道分配兩個位元組,這個空間可以被用來做加、減等數學運算。
存儲類型是對編譯器說明分配空間的位置。比如一個 int 數據,被聲明為auto時,在數據區分配內存,被聲明為static時,在程序區分配內存,被聲明為寄存器時,在寄存器分配內存(但要不是操系統,不要用這個類型),外部類型是你用其它文件的外部聲明是要用。
作用域從編程的角度來講的,並不像上兩個從編譯器的角度講。也就是一個變數可以被不同的作用域使用,或說是否透明。其實外部類型也可以這么理解,但是由於外部類型的聲明用到extern關鍵字,所以常在學習過程中與自動類,寄存器類,外部類和靜態類一起學。作用域在C中是由位置決定的,在C++中類的封裝中是由public,protect,private關鍵字決定,在類內也是由位置決定的。
『拾』 C語言全局變數的優缺點
當然有道理,因為全局也不是萬能的。
全局變數優點:
1.全局可視,任何一個函數都可以訪問和更改變數值。
2.內存地址固定,讀寫效率高
缺點:
1.容易造成命名沖突
2.當值不正確或者出錯時,很難確定是哪個函數更改過這個變數
3.不支持多線程