1、嚴禁使用未被初始化的指針:C++創建指針的時候,只分配存儲地址的內存,並不會分配存儲數據的內存,所以指針可能指向任何位置。
(1)使用解除運算符(*)之前,一定要對指針初始化,否則若聲明的指針剛好指向程序代碼的位置會導致一些很隱蔽的錯誤。
(2)未被初始化之前禁止指針之間的賦值。
例如:
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int *p,*q; p=q; return 0; }
或者
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int *p,*q; *p=100; return 0; }
在vs中會提示相應的問題
2、對NULL的理解
一開始想不明白:如果給一個指針初始化成NULL之后不是就代表,指針指向一塊內存單元了嗎,那應該可以直接往里面填值,可是實際卻不可以。
程序如下:
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int *p; p=NULL; *p=100; return 0; }
首先看一下百度百科中一段關於NULL的描述:
NULL的出現是一種約定俗成,事實上它不是C語言中的關鍵字;把一個指針賦值為NULL,通常的說法是“將指針懸空”。這樣,指針就無法再進行任何數據訪問了。編程工作中有一類比較容易犯的錯誤--指針地址未進行正確的更新賦值就加以使用,這往往會造成很嚴重的后果(對內存區進行錯誤的塗抹)。所以一個良好的習慣是,當一個指針的工作稍事休息,先把它賦值為NULL,待到再度使用時,重新對其賦值以及進行指針類型轉化。
前面說到“NULL指針無法再進行任何數據訪問”,其實是視編譯器功能而定的。0位置指向的是程序起始,對於不同的編譯器,NULL指針的操作結果是不同的:有些是不准讀寫,有些是只讀,甚至讀寫都允許。編譯器是人定的。引用網友win_hate在話題“關於NULL的不嚴謹”中的話來說:“如果說有誰不嚴謹了,那必定是讀取0位置的程序員,而不是C。
也就是說將指針賦值成NULL有些編譯器是不能往里邊填值的,所以要使用new來分配一段合適的內存才可以填值,而且使用new申請的內存還可以使用delete進行配對刪除,可以防止內存泄露。
所以NULL就像安全帶,將指針懸空,避免程序員因為大意而犯下一些不必要的錯誤。