#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;
}
“`