1. 程式人生 > >c 變數的儲存型別auto等(基礎知識)和c函式變數

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基礎知識——encodedecode函式

以前我們介紹過,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 只能用在函式