Arguably no other area of C++ confuses more people and causes more frustration than pointers. Here's a few quick tips to keep safe while using them.

Always check pointers
void MyFunc(int* X) {
std::cout << *X; //Bad!
}
void MyFunc(int* X) {
if(!X) return; //Better

std::cout << *X;
}
Always initialize pointers
int* MyPointer; //Bad!

std::cout << *MyPointer; //Potential Boom!
int* MyOtherPointer = NULL; // or, = 0

std::cout << *MyOtherPointer; //Still not good
int* MyLastPointer = NULL;

//Check for a valid pointer!
if(MyLastPointer) {
std::cout << *MyLastPointer; //Good
}
Always free allocated memory
int* X = new int[3];
int* Y = new int;

X[0] = 0;
X[1] = 1;
X[2] = 2;

*Y = 3;

//End of program - BAD!
int* X = new int[3];
int* Y = new int;

X[0] = 0;
X[1] = 1;
X[2] = 2;

*Y = 3;

delete [] X; //Note the []
delete Y; //Note no []
//Even better
int* X = new int[3];
int* Y = new int;

if(X) {
X[0] = 0;
X[1] = 1;
X[2] = 2;
}

if(Y) {
*Y = 3;
}

if(X) delete [] X;
if(Y) delete Y;