C語言再學習2——auto&register&static

前言:

爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。

在這裏插入圖片描述


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 修飾局部變量);二是用來表示不能被其他文件訪問的全局變量和函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章