來自的隨記

2021-08-04 18:28:53 字數 3792 閱讀 3967

c primer plus 的學習筆記,主要從陣列和指標開始

//陣列元素是變數(除非被宣告為const),但是陣列名不是變數。

//如果不修改字串,不要用指標指向字串字面量。

//如果要用陣列表示一系列待顯示的字串,請使用指標陣列,效率高。如果要改變字串或為字串輸入預留空間,不要使用指向字串字面量的指標。

//計算機不會在讀取字串時順便計算它的長度,然後再分配空間。

char *name;

scanf("%s,name");

name可能會擦寫程式中的資料或**。

//空字元是標記c字串末尾的字元

空指標是乙個值,函式使用它返回乙個有效位址表示某些特殊情況。

//gets讀取整行輸入,直至遇到換行符,丟棄它,在字元末尾新增乙個空字元使其成為c字串。如果輸入的字串過長會導致緩衝區溢位

//fgets()專門設計用於處理檔案輸入。

//scanf以下乙個空白字元(空行 空格 製表符 換行符)作為字串的結束。

//puts在顯示字串時會自動在其末尾新增乙個換行符。必須確保有空字元使其停止輸出。

//gets()丟棄輸入中的換行符,但是puts()在輸出中新增換行符。另一方面,fgets()保留輸入中的換行符,fputs()不會在輸出中新增換行符。

puts()應與gets()配對使用,fputs()應與fgets()配對使用。gets()已經被廢棄。

//與puts不同的是,printf()不會自動在每個字元末尾加上乙個換行符,因此必須在引數中指明在**使用換行符。

//被儲存的每個值都占用一定的物理記憶體,這樣一塊記憶體成為物件,物件導向程式設計中的物件指的是類物件,其定義包括資料和允許對資料進行的操作,c不是物件導向程式設計語言。

//const char * pc="behold a string literal!";

const只能保證被pc指向的字串內容不被修改,但是無法保證pc不指向別的字串。

//注意翻譯單元和檔案!

//變長陣列必須是自動儲存類別,這意味著無論在函式中宣告還是作為函式形參宣告,都不能使用static和extern儲存類別說明符,而且不能在宣告中初始化他們。

//變長陣列中的「變」不是指可以修改已建立的陣列的大小,一旦建立了變長陣列,它的大小則保持不變。這裡的「變」指的是:在建立陣列時,可以使用變數指定陣列的維度。

//帶變長陣列形參的函式實際上是在原始陣列中處理陣列,因此可以修改傳入的陣列。

//變長陣列還允許動態記憶體分配,這說明可以在程式執行時指定陣列的大小。普通c陣列都是靜態記憶體分配,即在編譯時確定陣列的大小。

它的儲存器從宣告處到塊的末尾,而不是從塊的開始處到塊的末尾。

//復合字面量是匿名的,所以不能先建立然後再使用它。必須在建立的同時使用它。它是提供只臨時需要的值的一種手段,具有塊作用域。

//塊作用域變數也能具有靜態儲存期,為了建立這樣的變數,要把變數宣告在塊中,且在宣告前面加上關鍵字static。

//暫存器變數儲存在cpu的暫存器中,訪問和處理這些變數的速度更快。由於其非儲存在記憶體中,所以無法獲取其位址,都是塊作用域、無鏈結和自動儲存期。可宣告為register的資料型別有限(如double不行太大了)。

//不能在函式的形參中使用static。

//外部鏈結的靜態變數具有檔案作用域、外部鏈結和靜態儲存期。如果乙個源**檔案使用的外部變數定義在另乙個源**檔案中,則必須用extern在該檔案宣告該變數。

//在執行塊中的語句時,塊作用域中的變數將「隱藏」檔案作用域中的同名變數。

//與自動變數不同,如果未初始化外部變數,它們會被自動初始化為0.並且只能使用常量表示式初始化檔案作用域變數。例如下面錯誤的例子

int x2 = 2 * x;//x是變數。

//定義式宣告和引用式宣告。

乙個變數只能有乙個定義式宣告,但是帶extern的宣告是引用式宣告,可以有多個。

//不要用關鍵字extern建立外部定義,只用它來引用現有的外部定義。

假設這樣寫:

extern int tern;

int main(void)

{}編譯器會假設tern實際的定義在該程式的別處,該宣告不會引起分配儲存空間。

//內部鏈結的靜態變數只能用於同乙個檔案中的函式。

//在同乙個檔案所有函式的外部宣告的變數是外部變數,如果在這種宣告前面加上關鍵字static,那麼其宣告的變數具有檔案作用域、內部鏈結和靜態儲存期。

//函式也有儲存類別,可以是外部函式(預設)或靜態函式。

//用static定義的變數具有靜態儲存期、檔案作用域和內部鏈結。

//靜態資料在程式載入時分配記憶體,而自動資料在程式執行塊時分配。

//在ancsi c中,應該堅持使用強制型別轉換,提高**可讀性。然而指向void的指標賦給任意型別的指標完全不用考慮型別匹配的問題。

//三種建立陣列的方法

1、宣告陣列時,用常量表示式表示陣列的維度,用陣列名訪問陣列的元素。可以用靜態記憶體或自動記憶體建立這種陣列。

2、宣告變長陣列時,用變數表示式表示陣列的維度,用陣列名訪問陣列的元素。具有這種特性的陣列只能在自動記憶體中建立。

3、宣告乙個指標,呼叫malloc(),將其返回值賦給指標,使用指標訪問陣列的元素。該指標可以是靜態的或動態的。

例如:double * ptd;

ptd = (double *) malloc(n * sizeof(double));

使用malloc(),程式可以在執行時才確定陣列大小。

//動態分配的記憶體數量只會增加,除非用free()釋放。

//在函式末尾處呼叫free()函式可避免「記憶體洩漏」的問題發生。

//calloc()函式把塊中的所有位都設定為0(並不是所有硬體系統都這樣)。同樣可以用free()釋放。

//變長陣列是自動儲存型別,不必用free()。但是malloc()不必侷限在乙個函式訪問。

//靜態儲存類別程式執行時被建立,程式結束時被銷毀。

自動儲存類別進入變數定義所在塊時存在,在程式離開塊時消失。這部分記憶體通常作為「棧」來處理。

動態分配的內存在呼叫malloc()等函式存在,未使用的記憶體塊分散在已使用的記憶體塊之間,同時使用動態記憶體通常比使用棧慢。

總而言之,程式把靜態物件、自動物件和動態分配的物件儲存在不同的區域。

//c90新增了兩個屬性:恆常性(constancy)和易變形(volatility)。分別用關鍵字const和volatile來宣告,c99標準新增了第3個限定符:restrict。用於提高編譯器優化。

//簡而言之,const放在*左側任意位置,限定了指標指向的資料不能改變;const放在*的右側,限定了指標本身不能改變。常見用法時宣告為函式形參的指標保護陣列資料。

//用const限定符宣告全域性資料很合理。

//在檔案間共享const資料要小心。可以採用兩個策略。第一,遵循外部變數的常用規則,即在乙個檔案中使用定義式宣告,在其他檔案中使用引用式宣告。

//volatile限定符告知計算機,**(而不是變數所在的程式)可以改變該變數的值。它涉及編譯器優化。詳見書。

//restrict關鍵字允許編譯器優化某部分**以更好地支援計算,它只能用於指標,表明該指標是訪問資料物件的唯一且初始的方式。

//_atomic  通過各種巨集函式來訪問原子型別,當乙個執行緒對乙個原子型別的物件執行原子操作時,其他執行緒不能訪問該物件。

//c99允許把型別限定符和儲存類別說明符static放在函式原型和函式頭的形式引數的初始化括號中。

static情況不同,新的用法告知編譯器如何使用形式引數。

//鏈結描述定義在程式某翻譯單元中的變數可被鏈結的程度。

//c的5中儲存類別(不包括執行緒的概念)

自動 | 暫存器 | 靜態、無鏈結 | 靜態、外部鏈結 | 靜態、內部鏈結

男人來自火星,女人來自金星

男人來自火星,女人來自金星 21 20 關於作者 約翰 格雷,心理學博士,國際知名人際關係和情感問題研究專家。多年來一直在世界各大城市主持 親密關係研討班 為全球男男 完善愛情關係 經營完美婚姻提供了極有益的幫助。關於本書 此書被譽為 關於兩性情感關係最著名的作品 作者在諮詢調查了25000人後,用...

過度互聯 隨記

在微博上發一條資訊,別人若覺得不錯因而 便會形成一條連線的鏈路。如果有人又將這個資訊 給了自己,就會形成乙個閉環迴路。一兩個閉環不足為懼,但如果是形成了足夠多的閉環,那就會造成資訊的 這就是一種過度互聯。事物與事物之間都是存在一定的聯絡的,比如春天來了,氣候暖和了,花草就重新生長了,動物就又遷徙回來...

java基礎隨記

1 static塊中,定義變數就要馬上賦值。這是由其本身靜態儲存所決定,所有變數必須在記憶體中確定的儲存位置。程式關閉的時候要釋放資源 runtime.getruntime addshutdownhook new thread 2 幾個註解 autowired可以對成員變數 方法和建構函式進行標註,...