天天看點

c語言eof_C語言持續深耕

1、指針和數組變量的差別

#include 
           

輸出:

output:

    15
    8
    0x7fff5ab94af5
    0x7fff5ab94af5
    0x7fff5ab94af5
    0x7fff5ab94ae8
           
  • printf("%pn", s); 與 printf("%pn", t); 相同可以看出 數組變量可以被當做指針使用 ,并指向數組在存儲器中的 起始位址
  • 對于sizeof運算,當參數為數組變量時,會自動計算對應的數組長度而非指針長度(其實就是這個資料類型所占的位元組大小)。
  • 對于數組變量取位址仍然為數組的起始位址:&s == s ==&s[0] 值相同但含義不同
  • 數組變量不能指向其他地方(數組名是個常量),但建立指針變量的時候計算機會為它配置設定存儲空間。實際上計算機隻會為數組配置設定存儲空間, 但不會為數組變量配置設定任何存儲空間 ,編譯器會在數組變量出現的地方将它替換成數組的起始位址。

2、C語言中指針+1運算

好文:詳解:C語言中的指針和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含義

注意:*p++ //先解引用,然後p的位址自增(與P指向的對象無關)

注意:p=NULL 和p=0 或 p='0' 等價

3、二維數組

二維數組可以形象的看作為用行指針、列指針來操作

行指針前+* = 列指針

列指針前+& = 行指針

p[n] == *(p+n)

p[n][m] == *( *(p+n)+ m )

4、C語言函數不定參數實作方式

好文:C語言函數不定參數實作方式

5、const關鍵字

#include
           

6、位元組對齊

//位元組對齊 原則;
           

好文:#pragma pack()用法詳解

7、大小端問題 Little-Endian Big-Endian

//大小端 + 聯合體
           

好文:C語言之大小端詳解_C/C++_qq_39412582的部落格-CSDN部落格

8、檔案操作

檔案操作

r 可讀權限 檔案必須存在 若不存在打開失敗報錯

r+ 可讀可寫權限 檔案必須存在 若檔案不存在打開失敗報錯

w 可寫權限 不允許檔案讀出 若檔案不存在 建立檔案

w+ 可讀可寫檔案 若檔案不存在 建立檔案

a 以附加方式打開可寫的檔案 若檔案存在 則會在檔案末尾進行資料寫入 若檔案不存在 建立檔案

a+ 以附加方式打開可讀可寫的檔案 若檔案存在 則會在檔案末尾進行資料寫入 若檔案不存在 建立檔案

//檔案操作 注意在同一個檔案中不要同時進行讀寫操作(檔案在讀寫時候檔案流會移動)
           

好文:C語言檔案讀寫操作總結 - home普通的人 - 部落格園

9、段錯誤快速定位

1、 編譯時gcc 1.c -g ,後邊加上-g

2、 運作時./a.out,産生段錯誤時會自動生成core.xxxx的檔案

(若沒有産生這個檔案,則在指令行輸入ulimit -c umlimited,重新編譯運作)

3、 用gdb調試 gdb a.out core.xxxx

4、 輸入where檢視詳細資訊,既可以定位段錯誤的位置

10、++i、i++

++i 先運算,再顯示值

i++ 先顯示,再運算

11、程式的終止及atexit函數詳解

好文:程式的終止及atexit函數詳解_C/C++_honeyJ-CSDN部落格

12、三目運算

好文:三目運算符詳解 - 鴻燕藏鋒 - 部落格園

對上文中第7點不甚了解,看不出來差別

13、指針

好文:C語言指針詳解 - lulipro - 部落格園

指針是程式資料在記憶體中的位址,而指針變量是用來儲存這些位址的變量。

為什麼需要指針?

第一,指針的使用使得不同區域的代碼可以輕易的共享記憶體資料。

第二,指針使得一些複雜的連結性的資料結構的建構成為可能,比如連結清單,鍊式二叉樹等等。

第三,有些操作必須使用指針。如操作申請的堆記憶體。

第四,C語言中的一切函數調用中,實參傳遞給形參的機理都是“按值傳遞(pass by value)”的,如果我們要在函數中修改被傳遞過來的對象,就必須通過這個對象的指針來完成。

//1) 一個有10個指針的數組,該指針是指向一個整型數的;
           

14、類型限定符

好文:C語言類型限定符

15、函數指針

#include 
           

16、數組指針array pointer 指針數組 pointer array

int 
           

指針數組(也就是元素為指針類型的數組)常常作為二維數組的一種便捷替代方式。一般情況下,這種數組中的指針會指向動态配置設定的記憶體區域。

//例如,如果需要處理字元串,可以将它們存儲在一個二維數組中,
           

17、 動态記憶體配置設定

兩個記憶體配置設定函數 malloc()和 calloc()的參數不一樣:

void*malloc(size_t size);
           

函數 malloc()配置設定連續的記憶體區域,其大小不小于 size。當程式通過 malloc()獲得記憶體區域時,記憶體中的内容尚未決定。

void*calloc(size_t count,size_t size);
           

函數 calloc()配置設定一塊記憶體區域,其大小至少是 count_size。換句話說,上述語句配置設定的空間應足夠容納一個具有 count 個元素的數組,每個元素占用 size 個位元組。而且,calloc()會把記憶體中每個位元組都初始化為 0。

18、應用

好文:C語言中引用的用法_C/C++_小米mm修仙路-CSDN部落格

指針和引用的差別

相同點:

1)都是位址的概念,指針指向一塊記憶體,它的内容是所指記憶體的位址;引用是某塊記憶體的别名。

差別:

1)指針是一個實體,而引用僅是個别名;

2)引用使用時無需解引用(*),指針需要解引用;

3)引用隻能在定義時被初始化一次,之後不可變;指針可變;

5)引用不能為空,指針可以為空;

6)“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的位址)的大小;

7)指針和引用的自增(++)運算意義不一樣;

8)從記憶體配置設定上看:程式為指針變量配置設定記憶體區域,而引用不需要配置設定記憶體區域。

19、 C語言編譯

四個步驟

一、預處理階段

展開頭檔案,宏替換,條件編譯,去掉注釋

二、編譯階段

檢查文法錯誤,生成彙編代碼

三、彙編階段

把彙編代碼轉換成二進制機器碼

四、連結階段

将所有機器碼連結在一起,生成可執行程式

20、 判斷float類型資料與某個值是否相等

float類型資料的比較我們不能使用"=="、"!="等确定性的判别,必選要轉換為">="、"<="等判别式

例如:判别float a是否為0

#include
           

21、連結清單

好文:【連結清單】連結清單常見筆試題和面試題(C語言)_C/C++_HongKnight的部落格-CSDN部落格

好文:數組和連結清單的差別淺析_網絡_我的部落格-CSDN部落格

好文:判斷一個連結清單是不是循環連結清單 - xshang - 部落格園

22、為什麼在定義結構體時成員變量不能賦初值?

TODO

22、聲明和定義的差別?

TODO

23、回調函數深入了解

好文:回調函數(callback)是什麼?