C 語言深度剖析個人簡單筆記

2021-08-22 16:33:14 字數 3146 閱讀 3407

1 定義宣告最重要的區別是 :定義建立了物件並且為其分配了記憶體。 宣告沒有分配記憶體。

2 reigster

最快的關鍵字 請求編譯器盡可能的將變數存放在cpu的暫存器中,以提高效率,是盡可能 ,不是絕對。

3 static

修飾變數 :靜態全域性變數作用域僅限於變數被定義的檔案中,(定義的開始出到檔案的結束 或者是使用之前再加上extern *)

靜態區域性變數,定義在函式體內,只是應用於這個函式體內。即使函式執行結束,靜態變數的值還是不會被銷毀,函式下次使用時仍然能用到這個值。

例如:

#include

static

int j;

int fun1(void)

int fun2(void)

int main()

printf("i = %d, j = %d\n",reti,retj);

return

0; }

請問 i?j?

i = 10, j = 1

4 變數的命名的規則

1)命名直觀,可望文生義,不允許使用拼音

2)命名的長度應當符合「min-length&&max-information」原則

3)單詞由多個單詞組成時候,每個單詞的字母應該大寫,

4)盡量避免名字中出現數字編號,除非邏輯上需要編號

5)乙個函式名禁止被用於其他處

6)定義變數的時候千萬不要忘記初始化,定義變數時編譯器不一定清空了這塊記憶體,他的值可能是無效的值。

7)不同型別的資料之間的運算要注意精度的擴充套件問題,一般是低精度向高精度擴充套件。

5 最冤枉的關鍵字–sizeof

sizeof() 不是函式是

int i;

sizeof(int)and sizeof(i)and sizeof i 值等於4

但是 sizeof int 就不行

總結 :sizeof 在計算「」變-量「」的時候可以省略括號

但是在計算型別的時候是不能省略括號的;

sizeof(int)*p 表示什麼意思?

(在32位系統中指標占用4個位元組 在64位系統中占用8位)

int *p = null;

int a[100];

sizeof(p) 8

sizeof(*p) 4

//只是求第乙個值的占用記憶體大小

sizeof(a) 400

sizeof(a[100]) 4

//只是在求第100 位的大小

6 bool

最好的格式是 if(test) || if (!test)

7 int *p = null

最好的判斷是 : if(null==p) ||if (null !=p )

8 switch

case :後面只能是整形或是字元常量或是常量表示式(想想字元型別在記憶體中是怎麼存的)
9 迴圈語句

for 迴圈巢狀的時候盡可能的將 短的迴圈放在最外層  將長的放在內迴圈(減少cpu 跨切迴圈層的次數 提高效率)
10 void的空指標

void *pvoid

pvoid ++ ansi錯誤 但是在gnu正確

pvoid+=1 ansi錯誤 但是在gnu正確

解釋:不能對void 指標進行演算法操作 都是不合法的 (進行演算法操作必須知道資料的型別的大小)

11對記憶體的操作

memset :接收一切型別的指標

memset(陣列名,設成的值,位元組長度)

memcpy(目的位址,源位址,位元組長度)

12 const

const int max=100

int array[max];

解釋;在c語言中會有報錯,(我們知道在定義陣列的時候要確定陣列的長度),所以在c語言中還是唯讀屬性,仍然是變數。

但是在c++中就不會報錯,c++編譯器做了擴充。(從彙編的角度看的話就是,const只是給出了對應的記憶體位址)

指標修飾:

const int *p //p可變,p指向的物件不可變

int const *p //p可變 ,p指向的物件不可變

int * const p //p不可變,物件可變

const int *const p //p不可變,物件也不可變

記憶方法:思想是近水樓台先得月 將型別去掉 修飾誰誰就是不能改變

13 最易變得關鍵字 —volatile

主要是告訴編譯器要不要去優化**

int i=10;

int j = i;

int k = i;

解釋過程:在記憶體中首先將i的值賦值給j,但是並沒有將其丟掉,在將j賦值給k ,提高了效率

volatile int i=10;

int j = i;

int k = i ;

解釋過程;volatile關鍵字就是告訴編譯器i的值隨時會發生改變,每次用它的時候都要從記憶體中取出來。(記憶體不能偷懶)

const volatile int i= 10;實際上此宣告表示的申明了乙個const int型的變數,所以i是唯讀變數,不能被修改。同時i又被volatile修飾了,意思就是說不允許編譯器優化**,在**中每次用到i時都要直接從記憶體中去取數。

所以,雖然const volatile int i = 10;定義沒錯,但是這樣的定義沒有什麼實際的意義。

14 struct關鍵字

struct student

stu;

sizeof(stu) = 1 結構體型別不管什麼樣子 其占有記憶體最小是1byte
15 注釋的奧妙

當c語言處理注釋的時候是 將注釋的部分用空格來替換,並不是全部刪除

16 #號預算符

#也是預處理:#define p(x) printf(「this is 「#x」 \n」,x);

p(8);

結果: this is 8

##號

#define xname(n) x##n

xname(8)

結果:x8

C語言簡單筆記

因為疫情原因,原本線下進行的c語言程式設計只能改為線上學習,學習效果不是很好,因此趁暑假的機會回顧一下c語言的主要知識。今天覆習的主要內容 資料型別,常量與變數。一 資料型別 c語言中,資料對使用者的呈現方式分為常量和變數,並且常量和變數都有不同的型別。具有相同性質的資料的集合可以看成一種資料型別。...

深度學習簡單筆記

各方法在訓練中對應的作用簡單解釋 微積分 求導 梯度下降法 求最優解 最小二乘法 尋找資料的最佳函式匹配 樸素葉貝斯 回歸 分類 極大似然估計 將概率最大化的引數作為真實估計值使用。似然函式 對數似然 取對數可以將連乘轉為連加且不影響單調性,但其實可能更重要的一點是概率的連乘將會變成乙個很小的值,可...

《C語言深度剖析》筆記

c語言深度剖析 筆記 1.在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返 回整形處理。2.register 變數必須是乙個單個的值,並且其長度應小於或等於整型 的長度。而且 register 變數可能不存放在記憶體中,所以不能用取 址運算子 來獲取 register變數的位址。3.int...