前言:
爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。
1. auto
編譯器默認的缺省情況下,所有變量都是 auto 的。
auto 修飾的變量,意味着變量當前的作用域爲當前函數或代碼段的局部變量,意味着當前變量會在內存棧上進行分配。
查了一些資料,發現都是說:編譯器在默認的缺省情況下,所有變量都是auto 的。 然而,對全局變量,局部變量用 auto 修飾時,發現全局變量是有問題的,推測是全局,局部變量的生命週期,存儲位置不一樣導致的問題。更嚴謹的說法應該是指 auto 修飾的變量的作用域或者生命週期盡在函數內部,如果不顯式聲明這個變量,其初始值是不確定的,而全局變量不顯式聲明,其初始值自動設置爲 0。
2. register
寄存器定義的變量,請求編譯器儘可能把變量定義在 CPU 內部的寄存器而不是通過內存尋址訪問以提高效率。
寄存器其實就是一塊一塊小的存儲空間,只不過其讀取數據比內存快的多。
register 變量必須是能被 CPU 寄存器接受的類型。意味着 register 變量必須是一個單個的值,並且其長度應小於或等於整型的長度,且 register 變量可能不放在內存中,故不能用去地址運算 “&” 來獲取 register 變量的地址。
寄存器的長度一般和機器的字長一致,所以,只有較短的類型如 int、char、short 等才適合定義爲寄存器變量,如 double 等較大的類型,不推薦將其定義爲寄存器類型。
3. static
3.1 作用一
修飾變量(局部 + 全局),都存在於內存的靜態區。
靜態全局變量: 作用域限制在變量被定義的文件中,其他文件即使使用 extern 聲明也無法反問它。作用域是從定義開始到文件結束,習慣上把定義在文件的頂端,這樣整個文件都可以使用,如果是定義在了文件的中間位置,定義之前的依舊不能夠使用它。
靜態局部變量: 在函數體內定義,只能在當前的函數內使用,同文件的其他函數也使用不了。因爲 static 修飾的變量總是存在靜態區,所以當這個函數運行結束,這個靜態區的值依舊不會被銷燬,函數下一次使用還是這個值。
測試程序:
#include<stdio.h>
#include<stdlib.h>
static int j = 0;
int k = 0;
void Static_Test(void)
{
static int i = 0;
j = 0;
k = 0;
i++;
k++;
j++;
printf("i = % d ,j = %d,k = % d\r\n", i, j, k);
}
int main(void)
{
int cnt;
for (cnt = 0; cnt < 10; cnt++)
{
Static_Test();
}
system("pause");
//getchar();
return 0;
}
測試結果:
局部變量使用 ststic 修飾後,雖然函數內部依舊有 static int i =0 ;初始化語句,但變量的值依舊是上一次運行保存的值,不會重新變爲 0 ;而全局變量(無論是否有 ststic 修飾)在函數內部重新賦值爲 0 後,再次重新初始化爲了 0。
3.1 作用二
修飾函數: 函數前加上 static 使得函數成爲靜態函數。表示函數的作用域僅僅侷限於本文件(又稱內部函數)。
優勢: 可以防止不同文件相同函數名之間的衝突。
C 引入 static 一是爲了表示退出一個塊後仍然存在的局部變量(static 修飾局部變量);二是用來表示不能被其他文件訪問的全局變量和函數。