c c 易錯知識點3(引用和指標)(二)

2021-08-07 10:23:08 字數 2983 閱讀 1159

1.記憶體訪問違規

#include using namespace std;

int main()

ival=*pi3編譯錯誤,ival為int型,*pi3為int*型,不能隱式轉換。

*pi2=*pi3編譯錯誤,*pi2為int型,*pi3為int*型,不能隱式轉換。

ival=pi2編譯錯誤,ival是int型,pi2是int*型,不能隱式轉換。

pi2=*pi1編譯錯誤,pi2是int*型,*pi1是int型,不能隱式轉換。

pi1=*pi3執行錯誤,pi3是null指標,試圖得到*pi3的值會發生執行錯誤。

pi1=ival編譯錯誤,pi1是int*型別,ival是int型別,不能隱式轉換。

3.指標常量與常量指標的區別

常量指標就是指向常量的指標,它所指向的位址的內容是不可修改的。const int* p或int const *p

指標常量就是指標的常量,它是不可改變位址的指標,但是可以對它指向的內容進行修改。int * const p

4.指標的區別

char * const p1;

char const * p2;

const char *p3;

const char * const p4;

p1:指標常量,本身不可修改,內容可以修改

p2:常量指標,本身可以修改,內容不可修改

p3:常量指標,本身可以修改,內容不可修改

p4:常量,不可修改內容

5.this指標

下列關於this指標的敘述中,正確的是(d)

a.任何與類相關的函式都有this指標

b,類的成員函式都有this指標

c.類的友元函式都有this指標

d,類的非靜態成員函式才有this指標

*a錯誤。類的非靜態成員函式是屬於類的物件,含有this指標。而類的static函式屬於類本身,不含this指標。

*b錯誤。類的非靜態成員函式是屬於類的物件,含有this指標。而類的static函式屬於類本身,不含this指標。

*c錯誤。友元函式是非成員函式,所以它無法通過this指標獲得乙份拷貝。

對於類成員函式而言,並不是乙個物件對應乙個單獨的成員函式體,而是此類的所有的物件共用這個成員函式體。當程式被編譯之後,此成員函式位址即已確定。我們常說,呼叫類成員函式時,會將當前物件的this指標傳給成員函式。沒錯,乙個類的成員函式體只有乙份,而成員函式之所以能把屬於此類的各個物件的資料區別開,就在於每次執行類成員函式時,都會把當前物件的this指標(物件首位址)傳入成員函式,函式體內所有對類資料成員的訪問,都會被轉化為this->資料成員的方式。

如果函式裡沒有訪問物件的任何資料成員,那麼此時傳進來的物件this指標實際上是沒有任何用處的。這樣的函式,其特徵與全域性函式並沒有太大區別。

6.指標陣列與陣列指標的區別

int* a[4]     指標陣列     

表示:陣列a中的元素都為int型指標    

元素表示:*a[i]   *(a[i])是一樣的,因為優先順序高於*

int (*a)[4]   陣列指標     

表示:指向陣列a的指標

元素表示:(*a)[i]  

#include int main()

;char **p=str+1;

str[0]=(*p++)+2;

str[1]=*(p+1);

str[2]=p[1]+3;

str[3]=p[0]+(str[2]-str[1]);

printf("%s\n",str[0]);

printf("%s\n",str[1]);

printf("%s\n",str[2]);

printf("%s\n",str[3]);

return 0;

}

輸出結果為:空;nanjing;jing;g

7.野指標的成因

(1)指標沒有被初始化

(2)指標p被free或delete後,沒有置為null

8.有了molloc/free,為什麼還有new/delete

malloc與free是c/c++的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

對於非內部資料型別的物件而言,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能把執行析構函式和析構函式的任務強加於malloc/free,因此只有使用new/delete運算子。

9.動態記憶體的傳遞

可以用三種方法解決動態記憶體傳遞的問題

(1)在c語言中,可以通過採用指向指標的指標解決這個問題,可以把str的位址傳給函式。

(2)在c++中,多了一種選擇,就是傳遞str指標的引用。

(3)使用函式返回值來傳遞動態記憶體。 

10.記憶體分配的幾種方式

(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如全域性變數。

(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放,處理器的指令集中有關於棧記憶體的分配運算,因此效率很高,但是分配的記憶體容量有限。

(3)從堆上分配,亦稱為動態記憶體分配。程式在執行時用malloc或new中申請任意多少的記憶體,自己負責何時用free或delete釋放。靈活但問題也多。

11.控制代碼和指標的區別

(1)控制代碼所指的可以是乙個很複雜的結構,並且很有可能是與系統有關的。比如說執行緒的控制代碼,它指向的就是乙個類或者結構,它和系統有很密切的關係。當乙個執行緒由於不可預料的原因而終止時,系統就可以返回它所占用的資料,如 cpu、記憶體等。反過來想可以知道,這個控制代碼中的某一些項是與系統進行互動的。由於windows系統是乙個多工的系統,它隨時都可能分配記憶體、**記憶體、重組記憶體。

(2)指標也可以指向乙個複雜結構,但是通常是由使用者定義的,所以必需的工作都要使用者完成,特別是刪除的時候。

指標易錯知識點小結

一 c語言指標知識點小結 1 初始化指標的時候會自動分配八個位元組 任何型別的指標 1 定義指標變數的時候,如int p 僅僅是代表該變數是指標變數,可以認為 int p 2 p a 是正確的。int p a 正確。表示把a的位址賦給p,是的指標p指向a.p a 這條語句是錯誤的,它表示的是把a的位...

指標知識點及易錯點總結

本文示例 環境為 vs2017下純c c 因為型別檢測增強,會直接標紅,需要強轉才能執行 1.指標 1.1指標簡介 指標是一種資料型別,自身占用記憶體空間 win32平台,所有指標占用4位元組記憶體空間 指標儲存的值是記憶體位址的編號。指標變數指向誰,就把誰的位址賦值給指標變數。指標通過 解引用,操...

C (二)引用和指標

引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名。定義的格式是 型別 引用變數名 已定義過得變數名 引用的特點 1 乙個變數可以取多個別名 2 引用必須初始化 3 引用只能在初始化的時候引用一次,不能改變為再引用其他的變數。include using namespace std vo...