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 遞迴注意事項 遞迴雖然經典,但是也有他的缺點 第一 遞迴是反...