《C專家編程》

const int * limitp = &limit;

這段代碼表示limitp是一個指向常量整型的指針。這個指針不能用於修改這個整型數。

int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main()
{
    int d = -1, x;
    /*...*/

    if(d <= TOTAL_ELEMENTS - 2)
        X = array[d+1];
    /*....*/
}

TOTAL_ELEMENTS所定義的值是unsigned int 類型(因爲sizeof()的返回類型是無符號數)。if語句在signed int 和unsigned int 之間測試相等性,所以d被升級爲unsigned int 類型,-1 轉換成unsigned int 的結果將是一個非常巨大的正整數,致使表達式的值爲假。啓示:儘量不要使用無符號類型。

寫成:
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
而不是
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(int))

因爲前者可以在不修改#define 語句的情況下改變數組的基本類型。

malloc(strlen(str));——————————————錯誤的
malloc(strlen(str)+1);————————————正確的

因爲用於容納字符串結尾都有‘\0’字符。

NUL 用於結束一個ASCII字符串
NULL 用於表示什麼也不指向(空指針)
network code()
{
    switch(line){
        case THING1:
        doit1();
    break;
        case THING2:
            if(x == STUFF){
                do_first_stuff();
                if(y == OTHER_STUFF)
                    break;
                do_later_stuff();
            }/*代碼意圖是跳到這裏......*/
            initialize_modes_pointer();
            break;
        default:
            processing();
    }/*.....但是事實上跳到了這裏*/
    use_modes_pointer();/*致使modes_pointer未初始化*/
}
i = 1, 2;         i最終結果是 1
i = (1, 2);       i最終結果是????
char * localized_time(char * filename)
{
    char buffer[120];
    /*......*/

    return buffer;
}

buffer是一個自動分配內存的數組,是該函數的局部變量。當控制流離開聲明自動變量的範圍時,自動變量便自動失效。這就意味着即使返回一個指向局部變量的指針,當函數結束時,由於該變量已被銷燬,誰也不知道這個指針所指向的局部變量的內容是什麼。解決辦法:

  1. 使用全局聲明數組
  2. 使用靜態數組
  3. 顯式分配內存 char * buffer = malloc(120);但是程序員承擔內存管理的責任。它適用於多線程的代碼。
  4. 要求調用者分配內存來保存函數的返回值。

第三章

union bits32_tag{
    int whole;                           /*一個32位的值*/
    struct {char c0, c1, c2, c3;} byte;  /*4個8位的值 */
}

這個聯合體允許程序員提取整個32位值,也可以提取單獨的字節字段如:value.byte.c0 。

char * const *(*next)();
  1. 首先看變量名,先把括號作爲一個整體,得出“next 是一個指向…的指針”。
  2. 再考慮括號外面的東西,優先級規則告訴我們右邊的括號優先級高,所以得出“next 是一個函數指針,指向一個返回的函數”。
  3. 處理前綴“*”,得出指針所指的內容。
  4. 最後,把“char * const”解釋爲指向字符的常量指針。
  5. 則這個聲明表示“next是一個指針,它指向一個函數,該函數返回另一個指針,該指針指向一個類型爲char的常量指針”。
typedef int x[10]和 #define x int[10]的區別?

 1. #define peach int
    unsigned peach i; // 沒有問題
    typedef int banana;
    unsigned banana i; // 錯誤 非法的

 2. #define int_ptr int *
    int_ptr chalk,cheese;
    真正含義是int * chalk, cheese; 而cheese 是一個inttypedef char * char_ptr;
    char_ptr Bentley,Rolls_Royce;
    它們的類型相同,都是指向char的指針。
typedef struct my_tag {int i;} my_type;

使用:
struct my_tag variable_1;
my_type variable_2;

常用英語翻譯

cast  強制類型轉換
actual parameter, argument 實際參數
alignment   對齊
array initialization 數組初始化
automatic  自動的
availability 可用的
call-by-value  傳值調用
consttant   常量
constraint  限制
curses library  函數庫
declaration   聲明
definition     定義
exceptions  異常
file descriptor  文件描述符
file pointer   文件指針
formal parameter 形式參數
heap   堆
kernel   內核
latency  等待時間
leak   泄露
linked list  鏈表
locality of reference  局部引用
method  方法
memory management  內存管理
pointer of function  函數指針
pointers-to-string 指向字符串的指針
polling   輪詢
private part 私有部分
prototype   原型
pure code   純代碼
read-only  只讀
returning an array from a function   從函數返回一個值
segmentation fault   段錯誤
segments    分段
sending a message  發送信息
signal handling  信號處理
stack   堆棧
stack frame  堆棧結構
stack segment  堆棧段
stack size 堆棧長度
storage-class   存儲類型
storage-class specifier   存儲類型說明符
swap 交換
tag   標籤
template   模板
terminal 終端 
threads   線程
type-qualifier   類型限定符
type-specifier   類型說明符
undefined     未定義的
unspecified   未說明的
unsigned preserving   無符號保留
value preserving  值保留
variable  argument   變量參數
virtual     虛擬
white space  空格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章