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 }
  • 相关阅读:
    [置顶] NO.4 使用预处理器进行调试
    VC用OLE方式读写Excel
    Eclipse 4.2 + Tomcat 7.x + JDK 7 搭建Java Web开发环境
    (step4.3.1) hdu 1010(Tempter of the Bone——DFS)
    linked-list-random-node
    insert-delete-getrandom-o1-duplicates-allowed
    C++中对Mysql的操作函数可以参考以下blog中的内容
    insert-delete-getrandom-o1
    kth-smallest-element-in-a-sorted-matrix
    combination-sum-iv
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11558100.html
Copyright © 2011-2022 走看看