c 變數的儲存型別auto等(基礎知識)和c函式變數
總結
1).在c語言中每一個變數和函式有兩個屬性:資料型別和資料的儲存類別。
2). 對資料型(如整型、字元型等)。儲存類別指的是資料在記憶體中儲存的方式。
儲存方式分為兩大類:
靜態儲存類和動態儲存類
具體包括四種:{自動的(auto), 靜態的(static), 暫存器(register), 外部的(extern)}。 根據變數的儲存類別, 可以知道變數的作用域和生存期。
一個程式在編譯執行的時候, 普通變數是存放在棧裡面的 而static會是的變數存放在data裡 整個記憶體主要分為四大區: CODE(程式碼), DATA(資料區,變數常量等), STACK(棧), HEAP(程式設計師定義)
例如:
區域性變數:
自動變數: int main(void){int a, b, c; 自動變數}
靜態區域性變數: int main(void){static int a, b, c; } 離開函式, 值仍保留
暫存器變數:int main(void){register int a, b, c; }
--------------------------
全域性變數:
靜態外部變數: static int A;
外部變數: int A ;
靜態儲存 { 靜態區域性變數(函式內有效), 靜態外部變數(本檔案內有效), 外部變數 (其他檔案可引用) }
注意:
靜態儲存是放在data段, 而動態儲存是放在棧裡面的
--------------------------------------------
auto變數
函式中的區域性變數, 如不專門宣告為static儲存類別, 都是動態地分配儲存空間的(棧), 資料儲存在動態儲存區中
函式中的形參和函式中定義的變數(包括符合語句中的變數), 都屬於類, 呼叫該函式時系統
會給他們分配儲存空間, 在函式結束時, 就會自動釋放這些儲存空間。
預設可以不寫auto
static宣告區域性變數
函式中的區域性變數的值在函式呼叫結束後不消失而保留原值, 即其佔用的儲存單元不釋放,
在下一次該函式呼叫時, 該變數已有值, 就是上一次函式呼叫結束時的值。
用static進行宣告
#include<stdio.h> int f(int a) { auto int b=0; static int c=3; b = b+1; // b== 1, 1, 1 c = c+1; // c==4, 5, 6 return (a+b+c) } void main() { int a=2, i; for(i=0;i<3;i++) { printf("%d\n", f(a)); } }
棧有個特點:
呼叫的時候會生成一個棧,用完回收。
而靜態則不會釋放, 對靜態區域性變數是在編譯時賦初始值, 即只賦初值一次, 在程式執行時他已有值。
register變數
如果有一些變數使用頻繁(例如一個函式迴圈中,每次迴圈都要引用某區域性變數, 則為存取變數的值要花費不少時間)。
為提高執行效率, c語言允許將區域性變數的值放在cpu中的暫存器中, 需要用時直接從
暫存器中參加運算, 不必再到記憶體中去存取。
#include<stdio.h> int fac(int n) { register int i, f=1; for(i=1; i<=n; i++) { f *= 1; } return (f); } void main() { int i; for (i=1;i<=15;i++) { printf("%d! = %d\n", i fac(i)) } }
extern 宣告外部變數(全域性)
外部變數即全域性變數, 它的作用域是從變數的定義處開始,到本程式檔案的末尾。
在此作用域內, 全域性變數可以為程式中的各個函式所引用。編譯時將外部變數分配在
靜態儲存區。
有時需要用extern來宣告外部變數, 以擴充套件外部變數的作用域。
#include <stdio.h> int max(int x, int y) { int z; z = x > y ? x : y; return (z); } int main(void) { extern A, B; printf("%d\n", max(A, b)); } int A = 13, B = -8;
函式變數
1.c
#include <stdio.h> int A; /×定義外部變數×/ --- 建立儲存空間 int main(void) { int power(int ); /× 函式宣告×/ }
2.c
extern A; /×宣告A為一個已定義的外部變數×/ --注意這裡不建立儲存空間,成為引用性宣告 int power(int n) { 。。。。。 }
用static宣告外部變數--本檔案使用
需求:
有時在程式設計中希望某些外部變數只限於被本檔案引用, 而不能被其他檔案引用。這時可以在
定義外部變數時加一個static宣告。
# include<stdio.h> static int A; /*這裡定義宣告為static, 不讓別的檔案引用*/ int main(void) { .... }
那麼下面這個extern A就拿不動A的值,可以理解為私有_A
extern A; /×宣告A為一個已定義的外部變數×/ int power(int n) { 。。。。。 }
關於變數的宣告和定義
對變數而言, 宣告和定義的關係稍微複雜一些。在宣告部分出現的變數有兩種情況:一種是需要
建立儲存空間的(如: int a;)另一種是不需要建立儲存空間的(如:extern a;)
前者是定義性宣告, 簡稱定義, 後者成為引用性宣告。
相關推薦
c 變數的儲存型別auto等(基礎知識)和c函式變數
總結 1).在c語言中每一個變數和函式有兩個屬性:資料型別和資料的儲存類別。 2). 對資料型(如整型、字元型等)。儲存類別指的是資料在記憶體中儲存的方式。 儲存方式分為兩大類: 靜態儲存類和動態儲存類 具體包括四種:{自動的(auto), 靜態的(static), 暫存器(registe
c語言演算法—01揹包問題(基礎型)
01揹包問題在動態規劃中很是常見,那就只簡略概述一下揹包問題: 有一個揹包,承重不能超過m千克,現有n件物品,都有其對應的質量與價值;要求在不超過最大承重的情況下,輸出最大價值; 解決這個問題的最基礎方式是使用二維陣列;行數為其物品的個數(0行空出),列數為
再論c#獲取儲存過程返回值(包括SqlSugar)
其實這個問題好多年以前研究過: https://blog.csdn.net/xpnew/article/details/6909902 最近因為需要統計日結月結,給同事寫了一套呼叫儲存過程的程式碼。同時因為專案ORM層是通過SqlSugar實現的,就又研究了一下SqlSugar呼叫儲存過程
用Swing開發GUI程序(基礎知識)
java基礎 GUI(Graphics User Interface)圖形用戶界面,可以讓用戶看著界面操作,所以要比控制臺程序更加直觀,可以提供更加豐富的功能。 在Java中,GUI操作的支持API,一般保存在java.awt和javax.swing包中,但一般情況我們選擇javax.swin
python3基礎學習筆記(基礎知識)-01
body 基礎語 弱類型 弱類型語言 class lean 邏輯表達式 列表 浮點型 python的基礎學習: 數據類型:python是弱類型語言,在定義變量的時候,可以不直接制定數據類型。 1、Numbers: int 有符號整型
運維自動化之ANSIBLE(基礎知識)
simple github remote inux 對象 場景 .tar.gz 使用場景 system Ansible發展史 Ansible ??創始人,Michael DeHaan( Cobbler 與 Func 的作者) ??2012-03-09,發布0.0.1版
mysql學習一 (基礎知識)
目錄 一、基礎語法 1、資料庫 2、表 3、記錄操作 一、基礎語法 1、資料庫 CREATE DATABASE dbname 選擇要操作的資料庫 USE dbname 顯示資料庫 SHOW DATABASES;
11、iOS開發詳解(基礎知識)
iOS開發詳解 本章節針對如何開發基於iOS系統的外掛進行介紹,在此之前,請閱讀Plugin Development Guide(外掛開發指南)對外掛的結構和JavaScript介面有一個大概的瞭解。 iOS外掛是以繼承至CDVPlugin類Object
UML類圖與類的關係詳解(基礎知識)
在畫類圖的時候,理清類和類之間的關係是重點。類的關係有泛化(Generalization)、實現(Realization)、依賴(Dependency)和關聯(Association)。其中關聯又分為一般關聯關係和聚合關係(Aggregation),合成關係(Composi
IO流總結(基礎知識)
IO流總結 IO這章的知識在上面一篇部落格也說過一點,主要要體會一下裝飾者設計模式和介面卡設計模式,這樣更利於我們理解複雜的IO體系結構。今天就讓我們看一看。不過在講IO 之前,我們先把檔案(File)的知識簡單過一下。 一、檔案File 檔案大家都不陌生,檢視JDK幫助
短實習---Java介面、關鍵字(基礎知識)
重要知識點: 1.static關鍵字 2.抽象類和介面 3.final關鍵字 一、static關鍵字 1.static可以修飾屬性、方法、程式碼塊 2.注:static只能修飾類成員,不能修飾區域性變數 二、final關鍵字 .final可以修飾的成員: 類:不能被繼承 變
Java併發(基礎知識)—— Executor框架及執行緒池
在Java併發(基礎知識)—— 建立、執行以及停止一個執行緒中講解了兩種建立執行緒的方式:直接繼承Thread類以及實現Runnable介面並賦給Thread,這兩種建立執行緒的方式線上程比較少的時候是沒有問題的,但是當需要建立大量執行緒時就會出現問題,因為
Android控制元件之WebView(基礎知識)
1. 常用設定 1.1 開啟網頁時不呼叫系統瀏覽器,而是在WebView中顯示。 WebView如果不設定setWebViewClient(),網頁在系統系統瀏覽器中開啟,如果設定則在WebView中顯示,同時還可以自定義WebViewClient。
JAVASCRIPT面向物件(基礎知識)第一章
面向物件的程式設計 理解物件 屬性型別 資料屬性 訪問器屬性 面向物件的程式設計 面向物件(Object-Oriented)是以類為概念,通過類可以建立各具無序屬性(包含了基本值、物件、函式)的物件。在ECMA-262把物件定義
Python基礎知識——encode和decode函式
以前我們介紹過,Python2.x中預設的編碼的基礎型別是unicode編碼的型別,在Python3.x才轉化為基於unicode的字串。 那麼我們在Python2.x的學習中就會遇到各種各樣的編碼問
C/C++中儲存型別修飾符的區別(auto、static、register、extern、volatile、restrict)
一、區域性變數和全域性變數: (1)區域性變數:區域性變數也叫自動變數,它宣告在函式開始,生存於棧,它的生命隨著函式的返回而結束。 #include <stdio.h> int main(void) { auto int i = 9; //宣告區域性
C語言中變數儲存型別有哪些?
變數的儲存型別是C語言的重要組成部分,也是C語言學習的基礎。那C語言中變數的儲存型別有哪幾種呢?在程式設計過程中又該怎樣運用呢?就這一問題,我今天給大家介紹一下!總的來說,C語言中變數的儲存型別可以分為四種,他們分別是自動變數、靜態變數、外部變數和暫存器變數這四種,
C語言支援的四種變數儲存型別
一)auto:auto稱為自動變數(區域性變數)。區域性變數是指在函式內部說明的變數(有時也稱為自動變數)。所有的非全程變數都被認為是區域性變數,所以auto實際上從來不用。區域性變數在函式呼叫時自動產生,但不會自動初始化,隨函式呼叫的結束,這個變數也就自動消失了。下次呼叫
c++ 變數儲存型別
extern 儲存型別 : 只宣告而不定義變數,變數的宣告只是告訴編輯器變數的名稱和資料型別;變數的定義是給變數分配儲存區域;優點就是可以在多個檔案裡面共享一個全域性變數, static 儲存型別: static指的是靜態變數(又叫永續性變數);靜態變數分為兩種,第一種是區
C++中變數儲存型別
儲存類 auto 儲存類 auto 儲存類是所有區域性變數預設的儲存類。 {int mount;autoint month;} 上面的例項定義了兩個帶有相同儲存類的變數,auto 只能用在函式