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是一個自動分配內存的數組,是該函數的局部變量。當控制流離開聲明自動變量的範圍時,自動變量便自動失效。這就意味着即使返回一個指向局部變量的指針,當函數結束時,由於該變量已被銷燬,誰也不知道這個指針所指向的局部變量的內容是什麼。解決辦法:
- 使用全局聲明數組
- 使用靜態數組
- 顯式分配內存 char * buffer = malloc(120);但是程序員承擔內存管理的責任。它適用於多線程的代碼。
- 要求調用者分配內存來保存函數的返回值。
第三章
union bits32_tag{
int whole; /*一個32位的值*/
struct {char c0, c1, c2, c3;} byte; /*4個8位的值 */
}
這個聯合體允許程序員提取整個32位值,也可以提取單獨的字節字段如:value.byte.c0 。
char * const *(*next)();
- 首先看變量名,先把括號作爲一個整體,得出“next 是一個指向…的指針”。
- 再考慮括號外面的東西,優先級規則告訴我們右邊的括號優先級高,所以得出“next 是一個函數指針,指向一個返回的函數”。
- 處理前綴“*”,得出指針所指的內容。
- 最後,把“char * const”解釋爲指向字符的常量指針。
- 則這個聲明表示“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 是一個int。
typedef 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 空格