C 0428 指標和空間分配

2021-09-20 06:41:32 字數 2808 閱讀 6707

檔案

開啟檔案

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...