摘要:本文主要探究一个问题:为什么使用指针变量时一定要申请空间?
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 }