每日一練day 1

2021-08-15 02:19:55 字數 4875 閱讀 9477

1、

關鍵字static

的作用?

static關鍵字至少有下列n個作用:

(1)設定變數的儲存域,函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;

(2)限制變數的作用域,在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問;

(3)限制函式的作用域,在模組內的static函式只可被這一模組內的其它函式呼叫,這個函式的使用範圍被限制在宣告它的模組內;

以下是c++對static的擴充套件

(4)在類中的static成員變數意味著它為該類的所有例項所共享,也就是說當某個類的例項修改了該靜態成員變數,其修改值為該類的其它所有例項所見;

(5)在類中的static成員函式屬於整個類所擁有,這個函式不接收this指標,因而只能訪問類的static成員變數。 2、

區域性變數能否全域性變數重名?

能,區域性會遮蔽全域性。

要用全域性變數,需要使用 "::" 

區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數,而那個區域性變數的作用域就在那個迴圈體內。

3、

static

全域性變數,區域性變數,函式與普通全域性變數,區域性變數,

函式static

全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通變數有什麼區別?static函式與普通函式有什麼區別?

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

2).static區域性變數只被初始化一次,下一次依據上一次結果值;

3).static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝

4、程式的記憶體分配,即乙個由c/c++

編譯的程式占用的記憶體分為幾個部分?

1、棧區(stack)— 由

編譯器自動分配釋放 

,存放函式引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 

2、堆區(heap) — 一般

由程式設計師分配釋放 

, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。 

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 

程式結束後由系統釋放

4、文字常量區 —常量字串就是放在這裡的。

程式結束後由系統釋放 

5、程式**區—存放函式體的二進位制**。 5、

解釋堆和棧的區別

棧中分配區域性變數空間,堆區是向上增長的用於分配程式設計師申請的記憶體空間.

(1)申請方式和**方式不同

棧(英文名稱是stack)是

系統自動分配空間

的,例如我們定義乙個 char a;系統會自動在棧上為其開闢空間。  由於棧上的空間是

自動分配自動**

的,所以棧上的資料的生存週期只是在函式的執行過程中,執行後就釋放掉,不可以再訪問。

而堆(英文名稱是heap)則是程式設計師根據需要

自己申請的空間

,例如malloc(10);開闢十個位元組的空間。   而堆上的資料只要程式設計師不釋放空間,就一直可以訪問到,不過缺點是一旦

忘記釋放會造成記憶體洩露。

(2)申請後系統的響應

棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣,**中的 delete語句才能正確的釋放本記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。 

也就是說堆會在申請後還要做一些後續的工作這就會引出申請效率的問題。

(3)     

申請效率的比較

棧:由系統自動分配,速度較快。但程式設計師是無法控制的。

堆:是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。

(4)     

申請大小的限制

棧:在windows下,棧是

向低位址擴充套件

的資料結構,是一塊

連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在 windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是

向高位址擴充套件

的資料結構,是

不連續的記憶體區域。這是由於系統是用

鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

(5)     

堆和棧中的儲存內容

由於棧的大小有限,所以用子函式還是有物理意義的,而不僅僅是邏輯意義。

棧: 在函式呼叫時,第乙個進棧的是

主函式中函式呼叫後的下一條指令

(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。

當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:一般是在堆的頭部用乙個位元組存放堆的大小。堆中的具體內容有程式設計師安排。

(6)     

訪問效率的比較

char s1 = "aaaaaaaaaaaaaaa";

char *s2 = "bbbbbbbbbbbbbbbbb";

aaaaaaaaaaa是在執行時刻賦值的;放在棧中。 

而bbbbbbbbbbb是在編譯時就確定的;放在堆中。 

但是,在以後的訪問中,在棧上的陣列比指標所指向的字串(例如堆)快。

另: 1、64為系統中  指標     8

int       8

double   16

char     1

c語言中講講static變數和static函式有什麼作用

static關鍵字有兩種意思,你看上下文來判斷 

1,表示變數是靜態儲存變數 

表示變數存放在靜態儲存區. 

2,表示該變數是內部連線 

(這種情況是指該變數不在任何{}之內,就象全域性變數那樣,這時候加上static) 

,也就是說在其它的.cpp檔案中,該變數是不可見的(你不能用). 

當static加在函式前面的時候 

表示該函式是內部連線,之在本檔案中有效,別的檔案中不能應用該函式. 

不加static

的函式預設為是全域性的. 

也就是說在其他的.cpp

中只要申明一下這個函式,就可以使用它. 

1、static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?

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

全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。

這兩者在儲存方式上並無不同。這兩者的

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

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

static函式與普通函式作用域不同。static函式僅在本檔案中使用。

只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案

static全域性變數與普通的全域性變數有什麼區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;

static區域性變數和普通區域性變數有什麼區別:static區域性變數只被初始化一次,下一次依據上一次結果值;

static函式與普通函式有什麼區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝

2、如何引用乙個已經定義過的全域性變數? 答:

extern

可以用引用標頭檔案的方式,也可以用extern關鍵字,如果用引用標頭檔案方式來引用某個在標頭檔案中宣告的全域性變理,假定你將那個變寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連線期間報錯。

3、全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?

答:可以,在不同的c檔案中以static形式來宣告同名全域性變數。

可以在不同的c檔案中宣告同名的全域性變數,前提是其中

只能有乙個c檔案中對此變數賦初值,此時連線不會出錯。

每日一練 1

左連線 以左表為主,右表沒有的填null 公升序 倒序 order by預設公升序 order by xx desc 取最大值 max 函式,例如 select max hire date from employees limit 1,2和limit 1offset 2的含義 limit 1,2第乙...

每日一練(Day7)

children 取得匹配元素的子元素集合 next 取得匹配元素後面緊鄰的同輩元素 prev 去得匹配元素前面緊鄰的同輩元素 siblings 取得匹配元素前後的所有同輩元素 closest 取得最近匹配元素 find 取得匹配元素中的元素集合,包括直接子元素和後代元素 原子性 字段不可分,否則就...

爬蟲每日一練(1)

教程 爬取乙個套圖 加了防盜煉解決方法 coding utf 8 import requests from bs4 import beautifulsoup import os import sys if os.name nt print u 你正在使用win平台 else print u 你正在使...