linux基礎知識 彙總

2021-09-16 22:41:46 字數 3278 閱讀 7501

1.限制變數的作用域

1) 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。

3) 在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。

2.設定變數的儲存域

static修飾的變數和全域性變數一樣,都儲存在靜態儲存區;而區域性變數儲存在棧區。

3.預設初始化0

static的第三個作用是預設初始化為0。其實全域性變數也具備這一屬性,因為全域性變數也儲存在靜態資料區。在靜態資料區,記憶體中所有的位元組預設值都是0x00。

針對第二點,我們看個例子: 

(1)變數不加 static 修飾

(2)變數被 static 修飾

總結:不加static修飾,函式或者**塊中的變數在函式或者**塊執行完畢後就直接**銷毀了,每次執行都會重新分配記憶體,每次都會銷毀。

加 static 修飾,函式或者**塊中的變數在函式或者**塊執行第一次初始化分配記憶體後,就算函式或者**塊執行完畢,該變數也不會被** 銷毀,直到程式結束 static 變數才會被**。

引申出的一些問題:

1. static全域性變數與普通的全域性變數有什麼區別 ?

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。

全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。

這兩者的區別在於非靜態全域性變數的作用域是整個源程式, 當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

static全域性變數只初使化一次,防止在其他檔案單元中被引用;  

2.  static區域性變數和普通區域性變數有什麼區別 ?

把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。 

3.  static函式與普通函式有什麼區別?

static函式與普通函式作用域不同,僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static修飾的函式),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案.

4.c語言的關鍵字static和c++的關鍵字static有什麼區別?

在c中static用來修飾區域性靜態變數和外部靜態變數、函式。

而c++中除了以上功能之外,還可以用來定義類的成員變數和函式。即靜態成員和靜態成員函式。

程式設計時static的記憶性和全域性性的特點可以讓在不同時期呼叫的函式進行通訊,傳遞資訊,而c++的靜態成員則可以在多個物件例項間進行通訊,傳遞資訊。

1:可以用來定義常量,修飾函式引數,修飾函式返回值,且被const修飾的東西,都受到強制保護,可以預防其它**無意識的進行修改,從而提高了程式的健壯性(是指系統對於規範要求以外的輸入能夠判斷這個輸入不符合規範要求,並能有合理的處理方式);

2: 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的引數,防止其被無意的**修改。簡而言之,這樣可以減少bug的出現;

3:給讀**的人傳遞有用的資訊,宣告乙個引數,是為了告訴使用者這個引數的應用目的;

const int *a; //指標指向的變數不可改變

int * const a;//指標變數不可以改變(即指向不可以改變)

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

1) 並行裝置的硬體暫存器(如:狀態暫存器)

2) 乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

3) 多執行緒應用中被幾個任務共享的變數

回答不出這個問題的人是不會被僱傭的。我認為這是區分c程式設計師和嵌入式系統程式設計師的最基本的問題。搞嵌入式的傢伙們經常同硬體、中斷、rtos等等打交道,所有這些都要求用到volatile變數。不懂得volatile的內容將會帶來災難。

假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。

1)乙個引數既可以是const還可以是volatile嗎?解釋為什麼。

2); 乙個指標可以是volatile 嗎?解釋為什麼。

3); 下面的函式有什麼錯誤:

int square(volatile int *ptr)

return *ptr * *ptr;

下面是答案:

1)是的。乙個例子是唯讀的狀態暫存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。

2)是的。儘管這並不很常見。乙個例子是當乙個中服務子程式修該乙個指向乙個buffer的指標時。

3) 這段**有點**。這段**的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向乙個volatile型引數,編譯器將產生類似下面的**:

int square(volatile int *ptr)

int a,b;

a = *ptr;

b = *ptr;

return a * b;

由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段**可能返不是你所期望的平方值!正確的**如下:

long square(volatile int *ptr)

int a;

a = *ptr;

return a * a;

linux基礎知識彙總

1 進入ubuntu 11.10的控制台 ctrl alt t或者是在file system中查詢 terminate 找到相應的terminate圖示,把它copy to desktop,就可以了。2 ubuntu中root使用者和user使用者的相互切換 因為ubuntu預設是不啟動root使用...

Linux面試基礎知識 彙總

怎麼檢視系統支援的所有訊號?kill l chmod 修改許可權 chown 修改檔案擁有者 chgrp修改群組 27.使用什麼命令檢視磁碟使用空間?空閒空間呢?df hl 29.使用什麼命令檢視 ip 位址及介面資訊?ifconfig df 命令獲得真正的檔案系統資料 檔案系統的磁碟使用情況 而 ...

基礎知識彙總

整型int,浮點型float,複合型complex 基本不使用 字串string,布林型bool,列表list,字典dict,集合set,元組tuple 可變資料型別 list dict set 當刪除第乙個元素的時候,後面的元素向前一定了一次,而for迴圈還是要向後走一步,這樣就錯過了在沒有刪除前...