c專家程式設計3 4章讀書筆記

2021-07-11 02:43:05 字數 1641 閱讀 7394

師兄畢業了,留給我一本c專家程式設計。今日略讀幾章,發現此書內容尚可,就是翻譯的不好,導致有些內容無法一下子就理解,現就其中的幾點內容做詳細分析。

1.「3.3 優先順序規則」與「3.4 通過圖表分析c語言宣告」,這一點內容我覺得寫的非常好,比較適於分析複雜的c語言宣告,就不給大家做展開分析了。

2. typedef int (*array_ptr)[100]

int (*array_ptr)[100]是陣列指標,這裡特別要與int *array_ptr[100]區分開來,根據c語言中符號的優先順序規則,優先順序要高於*,因此array_ptr先與[100]結合,代表array_ptr首先是乙個陣列,再與*結合,代表array_ptr中共包括100個int*型別的資料,這100個int*指標又可能分別指向不同的int資料,因此從總體上看int *array_ptr[100]是乙個二維陣列。以上分析過程可以使用「3.3 優先順序規則」與「3.4 通過圖表分析c語言宣告」中介紹的方法進行分析。而int (*array_ptr)[100]首先是乙個指標,而後這個指標指向乙個一維陣列,這個一維陣列的長度是n。因此從總體上看int (*array_ptr)[100]也是乙個二維陣列,但其第一維僅有乙個資料。

給大家對上述問題採用乙個更加簡單的描述方式,int (*array_ptr)[100]也可以寫為int (*)[100] array_ptr的形式。通過這種形式array_ptr的型別就更加一目了然了,array_ptr是乙個指向陣列的指標,因此array_ptr+1則是移動100個sizeof(int)位元組,因此array_ptr+1則指向了陣列最後乙個元素的下乙個元素,但此時array_ptr的型別仍然是int (*)[100]。

3. typedef 與 #define的區別

先給大家分享一些我在網上找到的資料

最直觀的乙個區別就是typedef 與 #define的用法是相反的,如下:

typedef    int       int;
#define    int       int

雖然在程式中都可以使用int,但#define在預處理結束後便再次被換為int,而typedef是定義了int型別的別名,是語言編譯過程的一部分。通過以上對比就可以發現兩種方法的作用時間不同,#define是在編譯的預處理階段發揮作用,但typedef在編譯階段有效。

4. 定義和宣告的區別

定義:只能出現在乙個地方,確定物件的型別並分配記憶體。

宣告:可以多次出現,描述物件的型別,用於指代其他地方定義的物件。

這裡要注意的是,由於宣告過程中不需要分配記憶體,因此不需要提供關於陣列長度的資訊。在宣告多維陣列時,需要提供除最左邊一維之外其他維的長度。

5. 定義為指標,但以陣列方式引用

在**這個問題前首先要對陣列變數的引用方式進行分析,其引用方式可分為通過陣列方式或指標方式進行引用。

1)通過陣列方式對變數進行引用的執行時步驟為:

2)通過指標方式對變數進行引用的執行時步驟為:

通過以上分析可以發現執行時系統對於陣列引用與指標引用的處理方式不同。因此當定義為陣列,引用為指標時,其執行步驟為:首先取陣列0的內容,加上偏移量形成位址,最後解引用獲得資料,但此時位址是錯誤的,因此通過以上方式就無法獲得正確的資料。上述引用方式往往會造成段錯誤。

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記

第一章 const float 表示乙個指向float型別常量的指標 第二章 1.在c語言中const並非真正表示 常量 在陣列定義與case中不可以使用 2.case的一些問題 2 3 main 15 這段 列印出來的是 3.函式可見性 void sb any where 2 extern voi...

《C專家程式設計》讀書筆記9

第九章 再論陣列 宣告本身還可以進一步分成3種情況 外部宣告 external array 的宣告。陣列的定義 記住,定義是宣告的一種特殊情況,它分配記憶體空間,並可能提供乙個初始值 函式引數的宣告。所有作為函式引數的陣列名總是可以通過編譯器轉換為指標。作為函式定義的形式引數,char s和 cha...