程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我也要學C語言-第十一章:自動變量,靜態變量和寄存器變量

我也要學C語言-第十一章:自動變量,靜態變量和寄存器變量

編輯:關於C語言

一:自動變量,靜態變量和寄存器變量的定義:  
  根據變量存儲位置不同,變量還可以分為自動變量,靜態變量和寄存器變量

  自動變量:局部沒有經過任何修飾的局部變量叫自動變量 (它存在於動態數據區——棧),這個區域內的數據隨著程序的運行動態的生成和釋放,函數返回就釋放,函數要調用就生成。關鍵字:默認是atuo(一般不寫).

  自動變量的特點:當程序執行到自動變量的作用域的時候就分配,不是到了聲明代碼才分配哦!到了代碼分配就晚啦!當定義自動變量的函數執行結束後,程序將釋放該自動變量的存儲空間,留給其他自動變量使用。事例:

#include <stdio.h>void add(int n){    auto int s = 0;    s = s + 1;    printf("No.%d: s=%d ", n, s);}void main(){    int i = 1;    for(i; i<4; i++)    {        add(i);    }}

輸出為:
No.1: s=1
No.2: s=1
No.3: s=1

從這個例子不難看出,自動變量的初始值在每次分配存儲空間後都要重新賦值。

  靜態變量:靜態變量其實也存在於數據區和全局變量是一樣的。但是靜態變量在編譯器級別有所限制(編譯器對於靜態變量的訪問做了限制(對內存空間的限制有兩種級別,一種是編譯器級別,這種訪問限制其實是編譯器在做語法檢查;第二種情況是操作系統級別,這種情況,要是你強制訪問,操作系統可能會藍屏或者報警告錯誤!))。調試證明:

這個證明:靜態變量其實也存在於數據區和全局變量是一樣的.

再看這個例子:

這裡為什麼會編譯錯誤呢!顯示x沒有定義。這當然大家都知道,但是為什麼呢?!同樣是數據區的東西為什麼訪問不了!我們再來看下下面的代碼:

這裡可以看到。0x88888888和0x12312312明明就是在一塊的,為什麼就不能訪問呢。原因看下面的圖(注意:下面是打開的.obj文件,也就是鏈接之前的那個文件):

我們把這些信息用注釋的方式寫到代碼裡看起來要好些:

我們從這裡可以清楚的看到,靜態變量被重新命名了,所以造成了無法訪問的問題。注意看重命名的規則,它集成了它所在的函數信息,變量和函數綁定了。有一定的規則!不過這個在編譯器內部規定,不同編譯器的規則是不一樣的。只要知道靜態變量的原理即可。

  靜態變量生存周期:和全局變量一樣,從可執行文件被加載到程序結束(它出生比main函數早,死亡比main函數晚)。

   局部靜態變量:它的存儲區還是在數據區。

   全局靜態變量無法誇文件,也是編譯器級別的控制。

   靜態變量的作用:實現私有。

  寄存器變量:我覺得這個可以不用說了,因為我通過調試和實踐發現寄存器變量分明就是雞肋!不用管它!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved