㈠ 當變數的存儲類型定義預設時,系統默認為變數的存儲類型為 c語言
當變數的存儲類型定義預設時,系統默認為變數的存儲類型為auto類型,分配在靜態區.
㈡ 系統什麼時候為變數分布存儲單元
系統什麼時候為變數分布存儲單元?系統在早上的時候也就是在12:00准時的時候,這個時候會變數分布純屬單位,因為他這種時候是比較敏感的,一個時候也就會成為它的變數分布,因為它這個變數分布純屬單元的話,所以它是需要變到這個單元格式,所以它需要存儲單元,所以系統一般是在自動設定的時候,也就是在更新的時候會變數分布存儲單元
㈢ 在變數寄存器中,變數什麼為獨立存儲器
寄存器的功能是存儲二進制代碼,它是由具有存儲功能的觸發器組合起來構成的。一個觸發器可以存儲1位二進制代碼,故存放n位二進制代碼的寄存器,需用n個觸發器來構成。下面小編給大家介紹一下「寄存器變數是什麼變數 寄存器變數怎麼用」
一、寄存器變數是什麼變數
在程序運行時,根據需要到內存中相應的存儲單元中調用,如果一個變數在程序中頻繁使用,例如循環變數,那麼,系統就必須多次訪問內存中的該單元,影響程序的執行效率。因此,C語言\C++語言還定義了一種變數,不是保存在內存上,而是直接存儲在CPU中的寄存器中,這種變數稱為寄存器變數。
寄存器變數的定義形式是:
register 類型標識符 變數名
寄存器是與機器硬體密切相關的,不同類型的計算機,寄存器的數目是不一樣的,通常為2到3個,對於在一個函數中說明的多於2到3個的寄存器變數,C編譯程序會自動地將寄存器變數變為自動變數。
由於受硬體寄存器長度的限制,所以寄存器變數只能是char、int或指針型。寄存器說明符只能用於說明函數中的變數和函數中的形參,因此不允許將外部變數或靜態變數說為"register"。
register型變數常用於作為循環控制變數,這是使用它的高速特點的最佳場合。
register[寄存器]變數告訴編譯器相關的變數應該改量存儲在高速度的寄存器中。使用register存儲類型的目的一般是為了提高執行速度,但是,register聲明只是向編譯器所提出的「建議」,並非強制要求。
(圖片來源於互聯網)
二、寄存器變數怎麼用
以下為一個寄存器變數的聲明:
register int variable;
寄存器變數:如果訪問過於頻繁,可使用此變數直接從寄存器訪問。
eg.
#include <stdio.h> /*編譯預處理指令*/
int sum ( int n );
/*一個函數聲明語句,sum(...)是一個名字叫sum的函數聲明,前邊的int說明該函數的返回值是整型;(int n)說明傳遞函數的形參是一個整型變數*/
int main () /*主函數的函數頭*/
{
int i , s; /*定義整型變數i,s*/
for ( i=1 ; i < = 5 ; i++ )
/*循環語句,首先執行 i = 1;
賦初值,再執行 i < =5;
判斷是否符合條件,如果符合就執行 { } 里循環體的語句,執行完後,再執行 i ++ 運算,i ++ 等價於 i = i +1;
再執行 i < = 5 進行條件判斷,如果符合就執行 { } 里循環體的語句,不符則跳出循環*/
printf ( " 前 % d 個自然數的和是 % d \n ", i, sum ( i ) );
/*第一個 % d 對應的是 i ,第二個 %d 對應的是 sum ( i ),sum ( i )是一個函數,返回值是int ;
第二個 % d 是整型的,所以第二個 sum ( i ) 返回前 i 項和*/
int sum ( int n )
/*定義一個返回值是整型的函數 sum ,它接受一個整型參數變數n*/
{
register int i , s = 0 ; /*定義寄存器變數*/
for ( i = 1 ; i < = n ; i ++ ) /*循環 n 次 */
s + = i ; /*賦值語句,等價於 s = s + i */
return s ; /*函數返回值*/
}
寫此程序的目的:測試寄存器變數的用法,像以上內容,如果頻繁訪問 i 的值,則可以使用寄存變數。
register要與不要的區別:
凡是聲明為 register 的變數,操作系統都會企圖將其放入寄存器中以加快速度,如果寄存器中滿了,則將由計算機硬體將寄存器中最久未使用的變數調入到高速緩沖存儲器(Cache) 中,同時放入你的變數。
寄存器是CPU的一部分,所以其訪問速度會遠遠高於同內存的訪問速度。
㈣ c語言變數的儲存類別及各自的特點
你自己根據需要歸納吧~
C語言變數存儲類型
auto
static
extern
static extern
register
auto 局部變數
auto 變數是用堆棧(stack)方式佔用儲存器空間,因此,當執行此區段是,系統會立即為這個變數分配存儲器空間,而程序執行完後,這個堆棧立即被系統收回.在大括弧{}內聲明.
自動變數就是指在函數內部定義使用的變數。他只是允許在定義他的函數內部使用它。在函數外的其他任何地方都不能使用的變數。自動變數是局部變數,即它的區域性是在定義他的函數內部有效。當然這說明自動變數也沒有鏈接性,因為它也不允許其他的文件訪問他。由於自動變數在定義他的函數的外面的任何地方都是不可見的,所以允許我們在這個函數外的其他地方或者是其他的函數內部定義同名的變數,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有鏈接性(即:不允許其他的文件訪問他的)。來看看自動量的持續性。計算機在執行這個函數的時候,創建並為它分配內存,當函數執行完畢返回後,自動變數就會被銷毀。這個過程是通過一個堆棧的機制來實現的。為自動變數分配內存就壓棧,而函數返回時就退棧。
static 靜態變數
一、局部靜態變數
局部變數按照存儲形式可分為三種auto, static, register。
與auto類型(普通)局部變數相比, static局部變數有三點不同:
1. 存儲空間分配不同
auto類型分配在棧上, 屬於動態存儲類別, 占動態存儲區空間, 函數調用結束後自動釋放, 而static分配在靜態存儲區, 在程序整個運行期間都不釋放. 兩者之間的作用域相同, 但生存期不同.
2. static局部變數在所處模塊在初次運行時進行初始化工作, 且只操作一次。
3. 對於局部靜態變數, 如果不賦初值, 編譯期會自動賦初值0或空字元, 而auto類型的初值是不確定的.
特點: static局部變數的」記憶性」與生存期的」全局性」
所謂」記憶性」是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. 「記憶性」, 程序運行很重要的一點就是可重復性, 而static變數的」記憶性」破壞了這種可重復性, 造成不同時刻至運行的結果可能不同.
2. 「生存期」全局性和唯一性. 普通的local變數的存儲空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊內存, 這就造成一個很重要的問題 ---- 不可重入性!!!
二、外部靜態變數/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。, 但為了限制全局變數/函數的作用域, 函數或變數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。注意此時, 對於外部(全局)變數, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限製作用, 限定作用域在本模塊(文件)內部.
使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
extern 變數
外部變數 定義在程序外部,所有的函數很程序段都可以使用.
外部變數可能會在某一程序段被重新定義,以段內變數為參考值.
static extern 變數
靜態外部變數和外部變數差別在於,外部變數生命可以同時給多個文件使用,而靜態外部變數則只能給聲明此變數的文件使用.
register 變數
寄存器變數,是由寄存器分配空間,訪問速度比訪問內存快,加快執行速度.寄存器大小有限.
在c語言當中可以使用寄存器變數來優化程序的性能,最常見的是在一個函數體當中,將一個常用的變數聲明為寄存器變數: register int ra; 如果可能的話,編譯器就會為它分配一個單獨的寄存器,在整個函數執行期間對這個變數的操作全都是對這個寄存器進行操作,這時候就不用頻繁地去訪存了,自然就提高了性能。
不能用於全局變數。現在的情況是VC忽略用戶定義的REGISTER,因此定義一個REGISTER變數與不定義一個REGISTER是一樣的,編譯器進行相同的優化,因為MS認為,REGISTER是系統中寶貴的資源,應該由系統統一調配,而且認為VC編譯器的優化能力要大於一般的程序員。因此也有人說register關鍵字在PC機(x86CPU)無用,編譯器按自動變數處理。
注意: register是不能取址的。
register int j; int *p = &j;是錯的,因為無法對寄存器的定址。
㈤ 系統存儲過程和系統變數的關系
互利共存。系統存儲過程和系統變數的關系是互利共存。存儲系統是指計算機中由存放程序和數據的各種存儲設備、控制部件及管理信息調度的設備(硬體)和演算法(軟體)所組成的系統。
㈥ 計算機系統中的存儲器系統是指ram存儲器
1 . 計算機的RAM(Random Access Memory)的別名為隨機存取記憶體,它相當於計算機上的移動存儲,用來存儲和保存數據的。它在任何時候都可以讀寫,RAM通常是作為操作系統或其他正在運行程序的臨時存儲介質(可稱作系統內存)。
㈦ 變數的存儲類型
我們在程序中會經常定義一些變數來保存和處理數據。從本質上看,變數代表了一段可操作的內存,也可以認為變數是內存的符號化表示。當程序中需要使用內存時,可以定義某種類型的變數。此時編譯器根據變數的數據類型分配一定大小的內存空間。程序就可以通過變數名來訪問對應的內存了。
如果說變數的數據類型決定了對應內存的大小,那麼存儲類型則影響著對應內存的使用方式。所謂使用方式,具體說就是在什麼時間、程序的什麼地方可以使用變數,即變數的生命周期和作用域。
先了解一些基本常識。一、在程序運行時內存中有三個區域可以保存變數:靜態存儲區、棧(stack)和堆(heap)。二、根據變數定義的位置可分為全局變數(定義在函數體外的變數)和局部變數(定義在函數體內的變數,包括形參)。
所有的全局變數和靜態局部變數(定義時使用關鍵字static)都保存在靜態存儲區,其特點是:在編譯時分配內存空間並進行初始化。在程序運行期間,變數一直存在,直到程序結束,變數對應的內存空間才被釋放。
而所有的非靜態局部變數(又稱為自動變數)保存在棧(stack)中,其特點是:在變數所在的函數或模塊被執行時動態創建,函數或模塊執行完時,變數對應的內存空間被釋放。換句話說,函數或模塊每被執行一次,局部變數就會重新被分配空間。如果變數定義時沒有初始化,那麼變數中的值是隨機數。
所有用malloc分配的內存(又稱為動態內存)都在堆(heap)中,其特點是:一般通過指針來訪問動態分配的內存。即可以通過free來手動釋放動態內存,也可以在程序結束時由系統自動釋放。
以上討論的是變數的生命周期,下面來看作用域。作用域指的是變數的可見范圍,即在變數的生命周期內,程序的哪些部分可以使用該變數。
全局變數的作用域從定義點開始一直到源文件的結束。如果要在定義點之前使用全局變數的話就需要使用關鍵字extern對作用域進行擴展。全局變數預設是可以被其他文件引用的。如果希望僅限於本文件使用的話,需要在定義時使用關鍵字static。
對於局部變數來說,無論是靜態局部變數還是自動變數,作用域都僅限於定義該變數的函數或模塊。
動態內存只要沒有被釋放就可以在程序的任何地方使用,前提是要知道動態內存的地址。
註:static加在全局變數前影響的是作用域,加在局部變數前影響的是生命周期。
㈧ 請教變數數據在內存中的存儲方式,比如int a=2,那麼在內存中是怎麼存儲的呢
額 你理解錯了 。 跟本就不存在a的ASCII碼值。
這樣看:定義了一個變數,給它取個名字叫a,這個名字是給你程序員看的,計算機跟本不看這個a,a對計算機來說只是一個標識,它標識著在內存中所佔用的一個大小為4B的內存空間,並且!這4B的空間存放一個整數,其值為2. 而在存儲的時候是這樣存的
由於內存的最小單位是位元組,也就是1B是最小的單位,而一個int類型的數據在32的系統中要佔用32位大小, 換算一個 8位=1位元組 即8bit=1B 那麼32位=4位元組。 這個2轉換成二進制數是10 ,但計算機要求用32位的數來存放這個2 ,咋辦? 補0唄。在哪補? 肯定不能在後邊補啊,那就變成別的數了—— 那,那就在前補。
所以是00000000 00000000 00000000 00000010
以上便是2這個數在計算機內存中的形式, 每8位一組分成4組剛好是4B大小,所以內存中就有連著的4個內存單元 來存放這個數值2. 而這一內存單元我們把它叫做a, 計算機也正是通過這個名字來標識這個數。
綜上,總結一下,a這個字母是給程序員看的, 計算機不認識a這字母,a在計算機中僅僅是轉換為一個計算機用於標識這個數值2的其它的什麼東西。 具體是什麼東西你不必要了解,其實我也不知道。而這個2在內存中存放的形式是佔用4個內存單元的空間。
樓主想更深入了解這方面,建議把C語言學一遍後學學匯編語言就很清楚了