为什么使用指针变量时一定要申请空间?

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

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 }
posted @ 2019-09-20 16:40  AmingGlaxy  阅读(953)  评论(0编辑  收藏  举报