指標那些事兒

2021-07-07 08:54:22 字數 3612 閱讀 3344

1.野指標(也叫懸擺指標,迷失指標)

野指標是導致bug的罪魁禍首之一。對指標呼叫delete後(釋放掉了它指向的記憶體,野指標還是指向原來的位址),如果沒有重新賦值就使用它,將導致難以預料的後果。因為此時操作野指標,它指向的記憶體位址可能已經分配給其他變數在使用了。

所以指標在delete之後,如果不再使用,一定要賦值nullptr。

2.const指標之一:指標本身是常量 or 指向的物件是常量

int ivalone = 111, ivaltwo = 222, ivalthree = 333;

//示例1.指標指向的內容是常量

const int *pvalone = &ivalone;

//*pvalone = ivaltwo; //錯誤,不能修改指標指向的內容:ivalone值不能被修改

//示例2.指標本身是常量

int * const pvaltwo = &ivaltwo;

*pvaltwo = ivalthree; //正確,可以修改指標指向的內容:ivaltwo的值修改為ivalthree的值

//示例3.指標本身及其所指向的內容都是常量

const int * const pvalthree = &ivalthree;

//*pvalthree = ivalone; //錯誤,不能修改指標指向的內容:ivalthree值不能被修改

常量指標,指標常量容易搞混淆,有乙個比較好的辦法,在星號(*)右邊畫一條豎線,

const在豎線左邊:不能修改內容(內容為常量),如以上**中示例1

const在豎線右邊:不能修改指標本身(指標本身為常量),如以上**中示例2

const在豎線兩邊:不能修改指標本身及其指向的內容

,如以上**中示例3

3.指標和陣列

3.1指標和一維陣列

int a[10];

for (int i = 0; i < 10; i++)

int *p = a;//同:int *p = &a[0];

for (int i = 0; i < 10; i++)

陣列位址與指標

int a[10];

for (int i = 0; i < 10; i++)

int *p;

p = &a[0];

cout << *(a + 1) << endl;//輸出1

cout << *(p + 2) << endl;//輸出2

3.2指標與二維陣列

二維陣列的記憶體位址是連續的,可以將二位陣列看做一維陣列。

int iarrayoftwodim[3][4] = 

, ,

};//輸出二維陣列

for (size_t i = 0; i < 3; i++)

cout << endl;

} //轉換為一維陣列

int iarrayonedim[12];

for (size_t i = 0; i < 3; i++)

} for (size_t i = 0; i < 12; i++)

輸出:

1    2    3    4

5 6 7 8

9 10 11 12

1 2

3 4

5 6

7 8

9 10

11 12

請按任意鍵繼續. . .

int iarrayoftwodim[3][4] =

, ,

};int *pval = iarrayoftwodim[0];//同:int *pval = &iarrayoftwodim[0][0];

//輸出二維陣列

for (size_t i = 0; i < 3; i++)

cout << endl;

}

輸出:

value(address 002efbec): 1

value(address 002efbf0): 2

value(address 002efbf4): 3

value(address 002efbf8): 4

value(address 002efbfc): 5

value(address 002efc00): 6

value(address 002efc04): 7

value(address 002efc08): 8

value(address 002efc0c): 9

value(address 002efc10): 10

value(address 002efc14): 11

value(address 002efc18): 12

請按任意鍵繼續. . .

4.指標與字串

//連線兩個字串 

char carrayone[50], carraytwo[50];

cout << sizeof(carrayone) << endl;

char *pstr1 = carrayone, *pstr2 = carraytwo;

cout << sizeof(pstr1) << endl;

cout << "please input str1:";

gets_s(carrayone);

cout << "please input pstr2:";

gets_s(carraytwo);

while (*pstr1 != '\0')

pstr1++;

while (*pstr2 != '\0')

*pstr1++ = *pstr2++;

*pstr1 = '\0';

cout << "str1 + str2:";

pstr1 = carrayone;//將pstr1重新指向carrayone

puts(pstr1);//同:puts(carrayone);

輸出:

50

4please input str1:i am

please input pstr2:fond of cplusplus!

str1 + str2:i am fond of cplusplus!

請按任意鍵繼續. . .

char*與char的區別

char*指向常量時,內容不能修改;char可以修改;

char *pstr = "i love c++!";

pstr[0] = 'u';//編譯時沒問題,執行時error

cout << pstr << endl;

用char

char carray[50] = "i love c++!";

char *pstr = carray;

pstr[0] = 'u';//ok

cout << pstr << endl;

c語言 關於指標的那些事兒

1 指標的實質 指標的本質上就是乙個位址,指標就比別的多了乙個解引用,即 可間接訪問他人。2 關於指標的操作 int a 10 int b 20 int p a p 100 a 100 a,表示獲取a的位址 指標 p b p 2000 p 200 b 200,p 表示解引用 int pp p pp ...

鏈結那些事兒

鏈結,就是將不同部分的 和資料收集和組合成為乙個單一檔案的過程,這個檔案可被載入到儲存器中執行。鏈結可以執行於編譯時 compile time 也就是源 被翻譯成機器 時 eg.普通的鏈結器鏈結,以及靜態鏈結庫,由靜態鏈結器鏈結 也可以執行於載入時 例如動態鏈結庫的載入時鏈結 也可以執行於執行時 r...

遞迴那些事兒

include include include include 求階乘 int fac int n if n 1 求累加 int add int n 求字串長度 int my strlen const char dest int main 遞迴注意事項 遞迴雖然經典,但是也有他的缺點 第一 遞迴是反...