首先几个概念:
一级指针:
int a;
int *p;
p = &a;
&p//指针所在内存的地址
p//指针p的值,也就是所指向内存区的地址(a的地址)
*p//p所指向内存区内的值(a的值)
二级指针:
int **q;
q = &p//q指向一个指针
&q//指针q所在内存区的地址
q//指针q的值,也就是p所在内存区的地址,等同于&p
*q//指针q所指向内存的值,也即是指针p的值,等同于p(a的地址)
**q//a的值
那为什么非要引入二级指针呢
先看一个例子:
#include<iostream>
using namespace std;
int a = 2, b = 3;
int * q;
void fun(int *p)
{
p = &b;
//*p = b;
}
int main()
{
q = &a;
cout << *q << endl;
fun(q);
cout << *q << endl;
return 0;
}
结果:
2
2
将指针作为参数传递,传入的是实参的拷贝,所以指针p和指针q指向的同一个内存,若在函数内改变p的指向,并不影响q。。。所以p指向的值并未改变。
当然若通过*p改变p所指向的内容,则q的指向也没变。。只不过指向的内存改变了。
再看使用二级指针的情况
#include<iostream>
using namespace std;
int a = 2, b = 3;
int * q;
void fun2(int **p)
{
*p = &b;
}
int main2()
{
q = &a;
cout << *q << endl;
fun2(&q);
cout << *q << endl;
return 0;
}
结果:
2
3
调用结束后指针q从指向a变成了指向b。
总结:
二级指针的引入是为了能够在函数调用的过程中保持对传入指针的改变。。即改变传入指针的指向。。
例如一个经常用到的场合
#include <iostream>
using namespace std;
void GetMeory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);//malloc返回一个void *
//*p = new char[num]; //C++当中
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str = NULL;
GetMeory(&str, 100);
strcpy(str,"Hello");
cout << str << endl;
return 0;
}
通过二级指针在函数内为外部指针分配内存