檔案
開啟檔案
ifstream 是用於讀取檔案的istream流,
ofstream是用於寫檔案的ostream流,
!ost檢測檔案是否成功開啟。
i/o錯誤處理
good()操作成功
eof()到達輸入尾部
fail()發生某些意外情況(例如,我們要讀入乙個數字,卻讀入了字元『x』)
bad()發生嚴重的意外(如磁碟讀故障)
讀取單個值
將程式分解為易管理的子模組
讀取結構化的檔案
在記憶體中的表示
讀取結構化的值
謹記編寫高質量**的最好途徑是閱讀大量**。
向量和自由空間
在c++中,一種可以儲存位址的資料雷西興稱為指標(pointer),
它在語法上使用字尾*來區分,因此double*表示「指向double的指標」。
儲存位址的物件被稱為指標。
int* ptr = &var; //ptr儲存var的位址
int x = 17;
int* pi = &x; //int指標
double e = 2.71828;
double* pd = &e; //double指標
*pi = 27; //正確:可以將27賦予pi指向的int
*pd = 3.14159; // 正確:可以將3.14159賦予pd指向的double
*pd = *pi; // 正確:可以將乙個int(*pi)賦予乙個double(*pd)
int i = pi; //錯誤:不能將乙個int*賦予乙個int
pi = 7; // 錯誤:不能將乙個int賦予乙個int*
char* pc = pi; //錯誤:不能將乙個int*賦予乙個char*
pi = pc; // 錯誤:不能將乙個char*賦予乙個int*
sizeof運算子
自由空間和指標
定義的全域性變數分配記憶體(稱為靜態儲存(static storage))。
編譯器還會為你預留呼叫函式時所需的空間,函式需要用這些空間儲存其引數
和區域性變數(稱為棧儲存(stack storage)或自動儲存(automatic storage)).
記憶體布局:
**靜態資料
自由空間
棧c++語言用稱為new的運算子將「自由空間」(free store,又稱為堆(heap))變為可用狀態。
double* p=new double[4]; //在自由空間中分配4個double
這段**要求c++執行時系統在自由空間中分配四個double,並將指向第乙個double的指標
返回給我們。
char* q = new double[4]; // 錯誤:將double*賦予char*
自由空間分配
通過指標訪問資料
double* p = new double[4]; //在自由空間中分配4個double
double x = *p; //讀取p指向(第乙個)物件
double y = p[2]; // 讀取p指向的第三個物件
指標範圍
指標帶來的主要問題是乙個指標並不「知道」它指向多少個元素。
double* pd = new double[3];
pd[2] = 2.2;
pd[4] = 4.4;
pd[-3] = -3.3;
為什麼指標不會記住自己的大小? 很顯然,我們可以設計乙個能記住大小的「指標」,
vector差不多就是如此。
12.4.4 初始化
對於內建型別,使用new分配的記憶體不會被初始化。如果想初始化單個物件,你可指定乙個值
,就像我們對p2所做的:*p2=5.5.注意{}初始化語法。它與相對,後者表示「陣列」。
對new分配的物件陣列,我們可以指定乙個初始化器列表。
double* p4 = new double[5] ;
double* p5 = new double ; //可以省略元素數目
當我們定義自己的型別時,可以更好地控制初始化。如果型別x有乙個預設建構函式,我們會得到:
x* px1 = new x; //乙個預設初始化的x
x* px2 = new x[17]; //17個預設初始化的x
如果型別y有乙個建構函式,但不是預設建構函式,我們需要顯示地初始化:
y* py1 = new y; // 錯誤,無缺省建構函式
y* py2 = new y; //正確:初始化為y
y* py3 = new y; //錯誤, 無缺省建構函式
y* py4 = new y ;
空指標用名字nullptr表示空指標是c++11的新特性,因此在舊**中,人們通常使用0(零)
或者null代替nullptr。兩種舊的替代方法都會導致混淆和錯誤,因此優先選擇更專用的nullptr.
自由空間釋放
delete有兩種形式:
delete p釋放new分配給單個物件的記憶體。
delete p釋放new分配給物件陣列的記憶體。
兩次刪除乙個物件是乙個糟糕的錯誤。
int* p = new int[5];
delete p; //很好,p指向由new建立的物件
delete p; //錯誤:p指向的記憶體時由自由空間管理器所擁有的
第二個delete p帶來兩個問題:
你已不再擁有指標指向的物件,因此自由空間管理器可能已經改變了它的內部資料結構,
導致你無法再次正確執行delete p。
自由空間管理可能已「**」p指向的記憶體,因此p現在可能指向其他物件;刪除這個物件
會引起錯誤。
析構函式
C 程式設計點滴6 指標引數和記憶體分配
當以指標作為引數,在函式中分配記憶體的時候,其操作要格外小心。include include include include void fun int p 執行結果如下 main 1 0x00032fa0 1fun 1 0x00032fa0 1fun 2 0x00032fd8 2main 2 0x0...
《c和指標》摘錄4 指標
記憶體和位址 計算機的記憶體由數以億計的位 bit 組成,每個位可以容納0或1。由於乙個位能表示的值範圍太有限,所以單獨的用處不大,通常許多位合成一組作為乙個單位,這樣就可以儲存範圍比較大的值。指標變數 專門存放變數的位址的變數 定義指標變數 資料型別 變數名 int a 指標變數必須初始化再使用 ...
C語言(九) 指標(3)指標與const
表示一旦得到了某個變數的位址,不能再指向其他變數 int i 0 int const q i q是 const q 20 ok q error表示不能通過指標去修改這個變數 int i 0 int j const int p i const int p 等同於 int const p p 20 er...