zoukankan      html  css  js  c++  java
  • 为什么使用指针变量时一定要申请空间?

    摘要:本文主要探究一个问题:为什么使用指针变量时一定要申请空间?

    1、问题的提出:

    我们在使用指针时,有时需要用指针指向一个变量,用指针来对变量进行操作;而有时我们就需要直接定义一个指针变量,然后用指针变量进行相关操作。针对第二种情况,直接采用以下的方式:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 struct Teacher
     6 {
     7     int age;
     8 };
     9 
    10 void AgeChange(Teacher **teacher) { //这里的形参采用的是二级指针的方式
    11     (*teacher)->age = 10;
    12 }
    13 
    14 int main() {
    15     Teacher *MrLiu=NULL;    //定义一个指针变量
    16     
    17     AgeChange(&MrLiu);   //根据形参要求,这里传入的是指针的地址
    18     cout << (*MrLiu).age << endl;
    19     
    20     system("pause");
    21     return 0;
    22 }

    上面的情况中,直接就崩,原因是什么呢?

    2、问题的探究:

    在上面的代码中,我们先定义了一个指针变量,其中的MrLiu本身就是一个指针,而这个指针并没有指向一个明确的地址;然后将这个指针放进函数中,该函数的形参取了这个指针的地址,程序进行到这里就埋下了一个隐患,这个地址一直都是不明确的;进入到程序中以后,对这个不明确的内存空间进行赋值操作,这样的操作是没有意义并且不合理的,所以就发生了崩溃。

    3、解决办法:

    上面问题的核心在于定义的指针变量是不明确的,那么我们只要在堆中申请一段空间,那么就可以编译通过。

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 struct Teacher
     6 {
     7     int age;
     8 };
     9 
    10 void AgeChange(Teacher **teacher) { //这里的形参采用的是二级指针的方式
    11     *teacher = new Teacher;
    12     (*teacher)->age = 10;
    13 }
    14 
    15 int main() {
    16     Teacher *MrLiu=NULL;    //定义一个指针变量
    17     
    18     AgeChange(&MrLiu);   //根据形参要求,这里传入的是指针的地址
    19     cout << (*MrLiu).age << endl;
    20 
    21     delete MrLiu;
    22     
    23     system("pause");
    24     return 0;
    25 }
  • 相关阅读:
    C# DataGridView显示行号的三种方法
    jQuery之前端国际化jQuery.i18n.properties
    大龄程序员的未来在何方
    【翻译】HTML5开发——轻量级Web Database存储库html5sql.js
    HBuilder webApp开发 Websql增删改查操作
    JS 互相调用iframe页面中js方法、VUE里 iframe 互调方法
    工具,百度编辑器 UEditor 使用实例化
    html 表格head头部不动 body部分滚动,每格宽同内容增加
    JS 正则收集(邮箱验证等)
    jQuery,title、仿title功能整理
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11558100.html
Copyright © 2011-2022 走看看