C與指標筆記第三章

2021-08-29 10:19:01 字數 4609 閱讀 2878

第一節:基本資料型別

c語言僅有四種基本資料型別:

1.整型

2.浮點型

3.指標型別

4.聚合型別

一.整型(九種)

1.字元

char

signed char 

unsigned chars

2.短整型

signed short int 

unsigned short int 

3.整型

signed int 

unsigned int 

4.長整型

signed long int 

unsigned long int

在16位平台下省缺int型別為2個位元組,long也為2個位元組        

整型相互之間的大小規則:

長整型至少和整型一樣長,而整型至少和短整型一樣長。

整型在省缺情況下是int型別的。    

省缺的char要麼是signed char,要麼是unsigned char,這取決於編譯器。

在vs與gcc中,char是signed的。

ansi標準規定:

1.long double至少和double一樣長,double至少和double一樣

2.標準同時規定了乙個最小範圍:所有浮點型最少能容納

10的-37次方~10的37次方之間的任何值。

浮點數在省缺情況下是double型別的。

三.指標

每個記憶體位置都由位址唯一確定並引用。

四.綜合:常量

1.使用const定義的常量:命名常量(named constanr,宣告為const的變數)

2.使用define巨集定義常量

3.字面值(literal、常量、字面值常量):

這是一種實體,制定了自身的值,並不允許發生改變

(一).整型字面值:編譯器通過字面值的書寫來確定是9種整型型別中的哪一種。

1.在字元後面新增:

uull

2.使用8進製0ddd

3.使用16進製制0xddd

在省缺情況下,字面值型別就是(int、unsigned int、long、unsigned long)

中最短但足以容納整個值的型別。

4.字元常量:就是乙個用單引號包圍起來的單個字元。

型別總是int,不能新增unsigned。

5.寬字元型別    

l'中'

(二).列舉型別:就是它們的值是自定義的符號常量而不是字面值(即不是使用者直接輸入數字賦值的)型別

注意:當然,也可以給列舉型別變數賦值為數字,也可以將列舉型別變數

賦值給其他整型變數。把列舉變數和整數無差別的混合在一起使用,會削弱

它們值的含義。

(三).浮點數字面值:總是寫成十進位制的形式,必須有乙個小數或指數。

3.14159

1e5 --->100000

25..5

6.023e2 ---> 602.3

(四).指標常量(pointer constant):

指標字面值常量無意義,null為特例。

第二節 變數的宣告

1.變數的定義:說明符(乙個或多個) 宣告表示式列表(被宣告的識別符號列表)

說明符(specisier):包含一些關鍵字,用於描述被宣告的識別符號的基本型別

2.在宣告變數時,如果宣告中已經至少有了乙個其他的說明符,int可以省略。

signed int ---> int 

unsigned int ---> unsigned

signed long int ---> signed long

3.*操作符執行的是間接訪問操作(indirection),也譯作間接定址

4.c語言中有幾種宣告,它們的型別名可以省略:

4.1.函式的省缺返回值型別為int型別。

4.2引數宣告的型別名省缺為int型別。

第三節 c語言中支援一中叫做typedef的機制,為已有的資料型別起別名。

注意:應使用typedef而不是#define來建立新的型別名。

typedef p_to_char char *;

p_to_char a, b;

正確地宣告了a,但是b卻被宣告為乙個字元。

#define只是簡單地符號替換。

第四節 常量

可以使用 const關鍵字來宣告常量

#define指令也是一種建立名字常量的機制

#define的優勢:

1.只要允許使用字面值常量的地方都可以使用#define;const變數只能用於

允許使用變數的地方。

2.使用名字常量定義陣列的長度。

第五節 作用域:識別符號宣告的位置決定了它的作用域

編譯器可以確認四種不同型別的作用域:

1.檔案作用域

1.1.任何在所有**塊之外宣告的識別符號都具有檔案作用域

1.2.從宣告之處到原始檔結尾都是可以訪問的

區域性變數隱藏其作用域除外

使用#include包含標頭檔案除外

2.函式作用域

只適用於語句標籤,語句標籤用於goto語句。

可以簡化為:乙個函式中的所有語句標籤必須為一。

goto語句不能從乙個函式調到另外乙個函式中。

3.**塊作用域

位於一對花括號之間的所有語句稱為乙個**塊。

在**塊的開始位置宣告的識別符號都具有**塊作用域。

4.原型作用域

只適用於在函式原型中宣告的函式。

唯一可能出現衝突的就是在同乙個原型中,不止一次的使用同乙個名字。

第六節 連線屬性(linkage)

一.識別符號的連線屬性決定:如何處理在不同的檔案中出現的識別符號。

二.連線屬性一共有三種:    

1.external(外部)

總被當做同一實體

2.internal(內部)

同一原始檔中表示同一實體,不同原始檔中表示不同實體。

3.none(無)

總被當做單獨的個體

三.作用域與連線屬性的關係:

識別符號的作用域與他的連線屬性有關,但這兩個屬性並不相同,識別符號的

位置和連線屬性,共同決定了變數的作用域。

四.extern 和 static

識別符號extern和static用於在宣告中修改識別符號的鏈結屬性。

1.每個宣告具有external鏈結屬性,加static連線屬性變為internal

2.extern為乙個識別符號指定external鏈結屬性,這只在第一次宣告中有效,當它

用於第二次或者以後的宣告時,並不會改變由第一次宣告所指定的鏈結屬性。

static int a;

3.從技術上說,這兩個關鍵字只有在宣告中才是必須的。建議在其他原始檔中的

宣告中新增extern關鍵字。    

第七節 變數的儲存型別:是指變數儲存值的記憶體型別。

一.關係

變數的儲存型別決定變數:

1.何時建立

2.何時銷毀

3.值儲存多久

二.儲存變數的位置

1.普通記憶體

2.執行時堆疊

3.硬體暫存器

三.儲存型別的分類

1.自動儲存型別(儲存型別是自動)

2.靜態儲存型別(儲存型別是靜態)

3.暫存器儲存型別(儲存型別是暫存器型別)

變數的位置和宣告決定了儲存型別。    

四.變數的省缺儲存型別取決於它的宣告位置:

1.在代任何碼塊之外宣告的變數:儲存於靜態記憶體中,無法指定其他的儲存型別。

稱為靜態(static)變數,靜態變數在程式執行之前建立。

2.在**塊內部宣告的變數:(automatic)省缺儲存型別是自動的,稱為

自動(auto)變數。關鍵字auto就是用於修飾這種儲存型別的。

五.關鍵字對儲存型別的影響:

1.static:對**塊內部宣告的變數使用static修飾。

儲存型別從自動變為靜態。

2.extern:對**塊內部宣告的變數使用extern修飾。

儲存型別從自動變為靜態。

3.register:關鍵字register可以用於自動變數的宣告,提示它們應該儲存

於硬體暫存器,稱為暫存器變數。

3.1優勢:

暫存器變數比儲存於記憶體中的變數訪問起來效率更高。

3.2機器不提供暫存器變數的位址。    

六.初始化問題:??????????

靜態變數:

1.不指定初始值,初始化為0。

2.在程式執行之前建立。

3.在編譯過程中值已經和對應變數名建立關係,儲存在data區(全域性

變數中已初始化的資料)。

自動變數:沒有省缺的初始值。

提供一條隱式的賦值語句使與變數名建立關係。

第八節 static關鍵字

當用於不同的上下文環境時,static關鍵字具有不同的意思。

一.用於**塊之外的變數宣告或定義函式時:

1.static關鍵字用於修改識別符號的連線屬性,從external改為internal。

2.但識別符號的作用域和儲存型別(函式的儲存型別本身就是靜態的)不受影響。

二.用於**塊內部的變數宣告時:

1.static關鍵字用於修改變數的儲存型別。

2.變數的連線屬性和作用域不受影響。在程式執行之前建立???

C與指標 第三章學習筆記

c與指標的第三章介紹了資料型別和作用域的知識,經查漏,要補缺的點如下 static用於函式和位於任何 塊之外的變數時,不改變其儲存性和作用域,只改變鏈結性,被static宣告的函式只能在原始檔內部訪問 static用於 塊內部變數時,變數的鏈結屬性和作用域不變,只改變儲存型別。變數在程式執行之前建立...

C和指標 第三章

一 看了半天,覺得最有價值的地方莫過於是資料的儲存和字元型別和指標之間的混沌關係 資料儲存 1.1棧區 編譯器在需要的時候分配,不需要的時候 一般變數的生命週期到外面的 為止 它的記憶體空間相對於堆來說,要小很多 比如申請int a 10000000000000 編譯器就會報錯 但是好在執行效率高,...

第三章筆記

第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...