以下均為個人看了《c和指標》reek著 人民郵電出版社後將之前不清楚或覺得需要強調的摘抄的:
預處理指令:
如下均為預處理指令:
#include
#include
#define max_cols 20
預處理指令(preprocessor directives)由預處理器(preprocessor)解釋,預處理器讀入源**,根據預處理指令對其進行修改,然後把修改過的源**遞交給編譯器。
環境
翻譯環境:源**被轉換為可執行的機器指令
執行環境:用於實際執行**
例如:交叉編譯器,在一台機器上執行,但它所產生的可執行**執行於不同型別的機器上。
字串常量:
被雙引號括起來的一串字元
eg:」hello」 在記憶體中佔據6個位元組的空間,(結尾有乙個null)
—————–常用printf格式**——————–
%d 十進位制
%o 八進位制
%x 十六進製制 (十六進製制中,可以使用字母abcdef或abcdef)
—————–常用scanf格式**——————–
%d 讀取一整型值
%f 讀取一浮點數
%c 讀取一字元
%s 讀取一字串
注:前三種因為讀取標量值,所以變數引數前加「&」eg
scanf("%d",&columns[num]);
—-型別————————–最小範圍——-
unsigned char —————- 0~255
short int —————— -32767~32767
unsigned short int———- 0~65535
int ————————— -32767~32767
浮點數預設情況:double型別,後面跟乙個l或l:long double / f或f:float型別
int* a, b, c; //b c為int!
int*a, *b, *c;
int a, *pi;
pi = &a; //pi的值為記憶體中某個特定位置的位址(a的儲存位址),*操作符使機器指向那個位置
null指標:要使乙個指標變數為null,可以給他賦乙個零值。
可以把字串常量賦值給乙個「指向字元的指標」,不能將其賦值給乙個字元陣列,因為字串常量的直接值是乙個指標!:
char *message = "hello";
等效於:
char *message;
message = "hello";
函式如果不顯式地宣告返回值型別,預設返回整型。
const:
int
const a;
等效於:
const
int a;
intconst *pci; //不能修改它所指向的值
int * const cpi; //指標是常量,它的值不能修改,但能修改它所指向的整型的值
static:
static int c(int d)
可以防止它被其它原始檔呼叫
extern:
為乙個識別符號指定external鏈結屬性,可以訪問在其他位置定義的這個實體
變數的儲存型別:
在**塊之外宣告的變數:儲存於靜態記憶體中,不屬於堆疊的記憶體,靜態變數。
在**塊內部宣告的變數:預設儲存型別是自動的,儲存於堆疊中,自動變數。
可以通過static,將儲存型別從自動變為靜態。
具有靜態儲存型別的變數在整個程式執行過程中一直存在,而不僅僅在宣告它的**塊的執行時存在。但,注意:修改變數的儲存型別並不表示修改該變數的作用域,仍只能在該**塊內部按名字訪問。
區域性變數由函式內部使用,不能被其它函式通過名字引用。預設情況下儲存型別為自動:一,當這些變數需要時才為他們分配儲存,可以減少記憶體的總需求量;二,在堆疊上為它們分配儲存可以有效地實現遞迴。
static關鍵字總結:
當它用於函式定義時,或用於**塊之外的變數宣告時:
只能在宣告他們的原始檔中訪問
當它用於**塊內部的變數宣告時:
如上(變數的儲存型別中)所述,用這種方式宣告的變數在程式執行之前建立,在程式的整個執行期間一直存在,而不是:每次在**塊開始執行時建立,在**塊執行完畢後銷毀。
示例:
int a = 5; //鏈結屬性為預設的:external
extern int b; //b的定義可以在此or其他地方
static int c; //static修改鏈結屬性為internal
//以上三個儲存型別為靜態,不儲存於堆疊中,在程式執行之前建立並一直保持他們的值,直到程式結束。
int d(int e)
//a的作用域本來是全程式,但該{}內有同名的變數,所以在該{}內,a指的是這{}裡定義的
//a,{}結束之後a指的是開頭定義的a
...}
例子,在一組字串中查詢:
int
find_char(char **strings, char
value) //strings: 指向字串的指標的指標
}return
0;}
指標運算:
當乙個指標和乙個整數量執行算術運算時,整數在執行加法運算前始終會根據合適的大小進行調整:
合適的大小:指標所指向型別的大小
調整:整數值和「合適的大小」相乘
兩個指標相減:結果型別是乙個有符號整數型別,值為兩個指標在記憶體中的距離(以陣列元素的長度為單位,而不是位元組! &p[j]-&p[i] = j - i )
追蹤遞迴函式:
變數建立於執行時堆疊上的,以前呼叫的函式變數仍保留在堆疊上,但他們被新函式的變數所掩蓋,因此不能被訪問。
對於下面這個求階乘問題:
factorial(n) = 1 (n = 0)
n * factorial(n-1) (n > 0)
如果用 遞迴函式 來做,會在執行時有些開銷:引數必須壓到堆疊中,為區域性變數分配記憶體空間,暫存器的值必須儲存。當遞迴函式的每次呼叫返回時,上述這些操作必須還原,恢復成原來的樣子。:
long factorial(int n)
所以不如用 迭代 來算階乘:
long factorial(int n)
return result;
}
《C和指標》摘錄(二)
當陣列名作為sizeof操作符的運算元 返回整個陣列的長度,而不是指向陣列的指標的長度int a 10 int c c a 0 等價於 c a 下標引用可以作用於任何的指標,而不僅僅是陣列名 int array 10 a for a 0 a 10 a 與 intarray 10 ap for ap ...
《c和指標》摘錄5 函式
對於乙個規模較大的程式,為了便於實現和維護,一般將其分為若干個程式模組,每個模組實現一定多功能。在c語言中,由函式實現模組的功能。乙個c程式由多個函式構成。與生活中 介面 例子類似,函式需要有明確的輸入 輸出規範。函式定義 返回值型別 函式名 引數列表 函式的引數傳遞2方式 定義變數後,系統要做2件...
《c和指標》摘錄4 指標
記憶體和位址 計算機的記憶體由數以億計的位 bit 組成,每個位可以容納0或1。由於乙個位能表示的值範圍太有限,所以單獨的用處不大,通常許多位合成一組作為乙個單位,這樣就可以儲存範圍比較大的值。指標變數 專門存放變數的位址的變數 定義指標變數 資料型別 變數名 int a 指標變數必須初始化再使用 ...