c++ 学习笔记之指针

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值