4.7. 指针和自由存储空间
void variableAddress() {
using namespace std;
int number = 10;
cout
<< "number's value:" << number << "\n"
<< "number's address: " << &number << "\n"
<< "use address visit variable: " << *&number << "\n";
}
void showPointer() {
using namespace std;
double point = 3.14;
double * ad_point;
ad_point = &point;
cout
<< "point = " << point << "\n"
<< "point address = " << &point << "\n"
<< "ad_point = " << ad_point << "\n"
<< "ad_point visit variable = " << *ad_point << "\n";
}
4.7.1. 声明和初始化指针
void declareAndInitPointer(){
using namespace std;
//声明创建一个指针
int * emPointer;
//声明创建一个指针、创建一个变量
int *P1,P2;
//声明一个类型为浮点型、字符型的指针
double * dP;char * cP;
//声明指针并初始化
int number = 1;
int * num_p;
num_p = &number;
cout << "number's value = " << number << "\n";
cout << "number's addr = " << &number << endl;
cout << "num_p's value = " << *num_p << "\n"
<< "num_p add = " << num_p << endl;
}
4.7.2. 指针的危险
void dangerPointer(){
using namespace std;
cout << "yep!" << endl;
int * nonarchive;
*nonarchive=200;
//将数值赋值给了一个未知的地址的变量
cout << "print nonarchive:""\n" << *nonarchive << "\n";
if (*nonarchive){
cout << "it's normal" << "\n";
}
else{
cout << "it's evil" << "\n";
}
//以上打印判断均无效
}
4.7.3. 指针和数字
void pointAndDigital(){
/*
* 将整数赋值给地址时,需将数值强制类型转换为对应的指针类型
*/
using namespace std;
int * p_Digi;
/*
* p_Digi = 0x123123
* error: assigning to 'int *' from incompatible type 'int'
*/
p_Digi = (int *)0xB23123123;
cout << "p_Digi :""\n" << p_Digi << "\n";
}
4.7.4. 使用new来分配内存
void distributeMem(){
using namespace std;
cout << "way1:" ;
int * dp = new int;
cout << "使用new方法\ndp's add = " << dp << "\n";
cout << "way2:";
cout << "将变量初始化的指针赋值给指针变量" << endl;
int vari;
int * p_vari = &vari;
cout << "p_vari = " << p_vari << endl;
}
4.7.5. 使用delete来释放内存
void deleteMem(){
using namespace std;
int * py = new int;
cout << "释放前访问py, py's add = " << py << "\n";
delete py;
cout << "释放后访问py, py's add = " << py << "\n";
/* delete py;
* cout << "再次释放后访问py, py's add = " << py << "\n";
* 释放前访问py, py's add = 0x7fb8464057d0
* 释放后访问py, py's add = 0x7fb8464057d0
* malloc: *** error for object 0x7fb8464057d0: pointer being freed was not allocated
* malloc: *** set a breakpoint in malloc_error_break to debug/
*/
// 不能使用delete来释放声明变量的内存
int number;
int *number_p = &number;
// cout << "尝试释放指针变量对应的内存";
// delete number_p;
int * num1 = new int;
int * num2 = num1;
delete num2;
}
4.7.6. 使用new来创建动态数组
void createDynamicArray(){
using namespace std;
cout << "使用new创建了动态数组" << endl;
int * p_array = new int[10];
cout << "使用delete释放由new创建的动态数组";
delete [] p_array;
}
void useDynamicArray(){
using namespace std;
int * grade = new int[10];
grade[0] = 3;grade[1] = 100;grade[2] = 5,grade[3] = 6;
grade = grade +1 ;
cout << "grade[0] = " << grade[0] << "\n";
//delete [] grade; pointer being freed was not allocated
/*
* 当指针地址发生变化时,delete就不适用了,需还原为原始地址才能释放
* 因为delete在释放时是根据地址去释放内存
*/
grade = grade -1;
delete [] grade;
}