《C和指標》摘錄(一)

2021-07-09 17:51:33 字數 3645 閱讀 6435

以下均為個人看了《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 指標變數必須初始化再使用 ...