#include <iostream>

using namespace std;
// 二级指针的使用 [11/24/2017 Andrew]

struct Teacher
{
    char name[64];
    int age;
};
//  在被调用函数中获取资源必须使用二级指针,因为局部函数
//中申请的变量会在函数调用结束的时候被释放掉,因此要使用二级指针 获取申请内存的实际地址
//这样就算局部函数申请结束的时候,也能够得到想要的内存空间
int  getTeacher(Teacher **p)
//传进来的指针是传值,多以编译器会从新申请一个指针,只不过跟原来的指针指向同一个内存区域
//会被编译但是新的指针的改变并不会改变原来指针值,只能通过指针改变指针指向的值,反过来要想改变指针必须使用指向指针的指针
//函数结束的时候p 被释放但是 *p 没有被释放
//因为在C语言中函数的参数是传值的 参数的类型是 Teacher ** 因此  p被重新声明一个变量

{
    Teacher *temp = NULL;
    if( p == NULL )
    {
        return -1;
    }
    temp = (Teacher *) malloc(sizeof(Teacher));
    if(temp == NULL)
    {
        return -2;
    }
    temp ->age =33;
    //通过修改实参的地间接的修改实参的值
    *p = temp;

    return 0;
}

int main()
{
     Teacher *pt1= NULL;

     getTeacher(&pt1);   //getTeacher(Teacher **p = &pt1)

     cout << "age :" << pt1->age << endl;

    system("pause");      
    return 0;
}

当使用以一级指针的时候,就不能达到修改指针的效果

#include <iostream>
using namespace std;
struct Teacher
{
    char name[64];
    int age;
};
int  getTeacher(Teacher *p)   

{
    Teacher *temp = NULL;
    if( p == NULL )
    {
        return -1;
    }
    temp = (Teacher *) malloc(sizeof(Teacher));
    if(temp == NULL)
    {
        return -2;
    }
    temp ->age =33;

    p = temp;

    return 0;
}

int main()
{
     Teacher *pt1= NULL;

     getTeacher(pt1);   //getTeacher(Teacher *p = pt1)这是真实的调用过程虽然,虽然 p 和pt1的值相同,但是改变p并不是改变pt1。
    //通过类比也可以明显的知道,想要改变数值可以通过指针,因此想要改变指针需要使用指向指针的指针;


     cout << "age :" << pt1->age << endl;

    system("pause");      
    return 0;
}

先从一个指针说起
假设  int* B = C;那么,B是一个指针,指向C, *B 是B的解引用 也就是C的值,但是B指向的内容是C的值,B也占内存,因此B也有自己的地址;

那么看来当是二级指针的时候,
*A= B = 0x00000008 
* A =  B = “abscd”; 
 A = &B = 0x00000004; 
 &A = 0x00000005;二级指针的使用
二级指针作为函数参数的作用:在函数的外部定义一个指针p,在函数的内部给指针赋值,函数结束后对指针p生效,那么我们就需要使用二级指针。
因为:编译器总是要为函数的每一个参数制作临时副本#include 
 using namespace std; 
 int a = 10; 
 int b = 100; 
 int *q;void func(int **p) 
 { 
 cout << “func: &p = “<< &p << “, p =” << endl; 
 *p = &b; 
 cout <<”func : &p =” << &p << “,p = “<使用引用实现的函数申请内存#include 
using namespace std; 
 // 二级指针的使用 [11/24/2017 Andrew]struct Teacher 
 { 
 char name[64]; 
 int age; 
 }; 
 // 在被调用函数中获取资源必须使用二级指针,因为局部函数 
 //中申请的变量会在函数调用结束的时候被释放掉,因此要使用二级指针 获取申请内存的实际地址 
 //这样就算局部函数申请结束的时候,也能够得到想要的内存空间 
 int getTeacher(Teacher **p) //传进来的指针是传值,多以编译器会从新申请一个指针,只不过跟原来的指针指向同一个内存区域 
 //会被编译但是新的指针的改变并不会改变原来指针值,只能通过指针改变指针指向的值,反过来要想改变指针必须使用指向指针的指针{ 
 Teacher *temp = NULL; 
 if( p == NULL ) 
 { 
 return -1; 
 } 
 temp = (Teacher *) malloc(sizeof(Teacher)); 
 if(temp == NULL) 
 { 
 return -2; 
 } 
 temp ->age =33; 
 //通过修改实参的地间接的修改实参的值 
 *p = temp;return 0;} 
 //C++中的指针的引用 
 int getTeacher2(Teacher * &myp) 
 { 
 //因为使用的是引用,因此给myp赋值就相当于给main函数中的pt1赋值 
 myp = (Teacher *) malloc(sizeof(Teacher)); 
 if( myp == NULL ) 
 { 
 return -1; 
 } 
 myp ->age =36; 
 return 0;} 
 void FreeTeacher(Teacher *pt) 
 { 
 if(pt == NULL) 
 { 
 return ; 
 } 
 free(pt); 
 } 
 int main() 
 { 
 Teacher *pt1= NULL; 
 // 1 C语言中的二级指针 [11/24/2017 Andrew] 
 getTeacher(&pt1); 
 cout << “age :” << pt1->age << endl; 
 FreeTeacher(pt1); 
 // 2 C++中的指针的引用 [11/24/2017 Andrew] 
 getTeacher2(pt1); 
 cout << “age :” << pt1->age << endl; 
 FreeTeacher(pt1); 
 system(“pause”); 
 return 0; 
 } 
 “`