1. 程式人生 > >《C和指標》第3章 資料

《C和指標》第3章 資料

3.1 基本資料型別
3.1.1 整型家族
整型家族包括字元、短整型、整型和長整型,它們都分為有符號(singed)和無符號(unsigned)兩種版本。
長整型至少應該和整型一樣長,而整型至少應該和短整型一樣長。
標頭檔案limits.h說明了各種不同的整數型別的特點。
一、整型字面值
字面值(literal)這個術語是字面值常量的縮寫——這是一種實體,指定了自身的值,並且不允許發生改變。
二、列舉型別
列舉(enumerated)型別就是指它的值為常量而不是字面值的型別,她們以下面的這種形式宣告:
enum Jar_Type {CUP,PINT,QUART,HALF_GALLON,GALLON};
這條語句聲明瞭一個型別,稱為Jar_Type.這種型別的變數按下列方式宣告:
enum Jar_Type milk_jug, gas_can, medicine_bottle;

3.1.2 浮點型別
浮點數家族包括float、double和long duoble型別。ANSI標準規定long double至少和double一樣長,而double至少和float一樣長。
標頭檔案float.h定義了名字FLT_MAX、DBL_MAX和LDBL_MAX,分別表示float、double和long double所能儲存的最大值。而FLT_MIN、DBL_MIN和LDBL_MIN則分別表示float、double和long double能夠儲存的最小值。
浮點數字面值總是寫成十進位制的形式,它必須有一個小數點或一個指數,也可以兩者都有。浮點數字面值在預設情況下都是double型別的,除非它後面跟一個L或l表示它是一個long double型別的值,或者跟一個F或f表示它是一個float型別的值。
3.1.3 指標
你可以把計算機的記憶體想象成一條長街的一間間房子,每間房子都用一個唯一的號碼進行標識。每個位置包含一個值,這和它的地址是獨立且顯著不同的,即使它們都是數字。
一、指標常量(pointer constant)
C語言內部並有特地定義這個概念。
二、字串常量(string literal)
C語言提供了字串常量。

3.2 基本宣告
在宣告整形變數時,如果宣告中已經至少有了一個其他的說明符,關鍵字int可以省略。unsigned short int a;等效於 unsigned short a;
3.2.1 初始化
3.2.2 宣告簡單陣列
int values[20];
3.2.3 宣告指標
int a;
這條語句表示表示式
a產生的結果型別是int。知道了操作符執行的是間接訪問操作以後,我們可以推斷a肯定是一個指向int的指標。
警告:
C在本質上是一種自由形式的語言,這很容易誘使你把星號寫在靠近型別的一側,如下所示:
int
a;
這個宣告與前面一個宣告具有相同的意思,而且看上去更為清楚,a被宣告為int的指標。但是,這並不是一個號技巧,原因如下:
int

a,b,c;
並不是聲明瞭三個int的指標,而是一個int的a,兩個int的b,c。要宣告三個指標的正確形式如下:
int *a,*b,*c;

char message = “Hello world!”;
這條語句把message宣告為一個指向字元的指標,並用字串常量中第1個字元的地址對該指標進行初始化。
警告:
看上去初始值似乎是賦給表示式
message,事實上它是賦給message本身的。相當於:
char *message;
message = “Hello world!”;
3.2.4 隱式宣告
如果省略了引數的型別,編譯器會預設它們為整型。

3.3 typedf
它允許為各種型別定義新名字。例如:
char *ptr_to_char;
把變數ptr_to_char宣告為一個指向字元的指標。
typedef char *ptr_to_char;
這個宣告把識別符號ptr_to_char作為指向字元的指標型別的新名字。你可以向使用任何預定義名字一樣在下面的宣告中使用這個新名字。例如:
ptr_to_char a;
宣告a是一個指向字元的指標。

3.4 常量
使用const關鍵字來宣告常量,例如:
int const a;
const int a;
這兩條語句都把a宣告為一個整數,它的值不能被修改。
如何給常量賦值1:
int const a = 15;
2:在函式中宣告為const的形參在函式被呼叫時會得到實參的值。
當涉及到指標變數時,有兩樣東西可以成為常量——指標變數和它所指向的實體。
int *pi;//pi是一個普通的指向整型的指標。
int const *pci;//一個指向整型常量的指標。可以修改指標的值,但不能修改它所指向的值。
int *const cpi;//pci為一個指向整型的常量指標。指標是常量不可以修改,可以修改它所指向的整型的值。
int const * const cpci;//無論指標本身還是它所指向的值都是常量,不允許修改。

#define MAX_ELEMENTS 50
int const mex_element=50;
只要允許使用字面值常量的地方都可以使用前者,比如宣告陣列的長度。const變數只能用於允許使用變數的地方。

3.5 作用域(scope)
3.5.1 程式碼塊作用域
位於一對花括號之間的所有語句稱為一個程式碼塊。任何在程式碼塊的開始位置宣告的識別符號都具有程式碼塊作用域(block scope)。
3.5.2 檔案作用域
任何在所有程式碼塊之外宣告的識別符號都具有檔案作用域(file scope),它表示這些識別符號從它們的宣告之處指導它所在的原始檔結尾處都是可以訪問的。在標頭檔案中編寫並通過#include指令包含到其他溫進中的宣告就好像它們是直接寫在那些檔案中一樣。它們的作用域並不侷限於標頭檔案的檔案尾。
3.5.3 原型作用域
原型作用域(prototype scope)只適用於在函式原型中宣告的引數名。
3.5.4 函式作用域
函式作用域(function scope)只適用於語句標籤,語句標籤用於goto語句。

3.6 連結屬性
識別符號的連結屬性(linkage)決定如何處理在不同檔案中出現的識別符號。識別符號的作用域與它連結屬性有關,但這兩個屬性並不相同。連結屬性一共有3種——external(外部)、internal(內部)和none(無)。
在這裡插入圖片描述
在預設情況下,識別符號b、c和f的連結屬性為external,其餘識別符號的連結屬性則為none。因此,如果另外一個原始檔也包含了識別符號b的類似宣告並呼叫了函式c,它們實際上訪問的是這個原始檔所定義的實體。f的連結之所以是external是因為它是個函式名。
關鍵字extern和static用於在宣告中修改識別符號的連結屬性。如果某個宣告在正常情況下具有external連結屬性,在它前面加上static關鍵字可以使它的連結屬性變為internal。例如,如果第2個宣告如下:
static int b;
那麼變數b就將為這個原始檔所私有。在其他原始檔中,如果也連結到一個叫做b的變數,那麼它所引用的就是另一個不同的變數。類似,也可以把函式宣告為static,如下:
static int c(int b);
這可以防止它被其他原始檔呼叫。
static只對預設連結屬性為external的宣告才有改變連結屬性的效果。
extern關鍵字一般而言,它為一個識別符號指定external連結屬性。


3.7 儲存型別
有三個地方可以用於儲存變數:普通記憶體、執行時堆疊、硬體暫存器。
3.8 static關鍵字
當它用於函式定義時,或用於程式碼塊之外的變數宣告時,static關鍵字用於修改識別符號的連結屬性,從external改為internal,但識別符號的儲存型別和作用域不受影響。用這種方式宣告的函式或變數只能在宣告它們的原始檔中訪問。
當它用於程式碼塊內部宣告時,static關鍵字用於修改變數的儲存型別,從自動變數修改為靜態變數,但變數的連結屬性和作用域不受影響。用這種方式宣告的變數在程式執行之前建立,並在程式的整個執行期間一直存在,而不是每次在程式碼塊開始執行時建立,在程式碼塊執行完畢後銷燬。

3.10 總結

在這裡插入圖片描述