1. 传参是一个指针
int m_value = 1;
void func(int *p) {
p = &m_value;
}
int main(int argc, char const *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn << endl;
return 0;
}
输出:
2
2
当我们把一个指针作为参数传给一个方法时,其实是把指针的副本传给了方法,也就是指针的值传递。因此,如果我们在方法的内部修改指针本身的值,那么我们改的只是副本的值而已,而不是原来的指针本身,原来的指针还保留着原来的值。
2. 使用指针的指针
void func(int **p) {
*p = new int;
**p = 5;
}
int main(int argc, char const *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(&pn);
cout << *pn << endl;
return 0;
}
输出
2
5
上面代码将 func
改为了接收参数为指向指针的指针。因此,当我们进行解指针赋值 *p = new int
时,其实改变的就是指针 *p
本身的值。
为什么需要使用指向指针的指针?
有时候,我们的函数有一个表示结果码的返回值,同时,函数也希望返回一个由这个函数生成的数据结构。也就是说,这个函数可能希望返回两种类型的数据。这时,我们就可以用 指向指针的指针。
int ANeuralNetworksExecution_create(ANeuralNetworksCompilation* compilation,
ANeuralNetworksExecution** execution);
第二个参数 execution
就是一个指向 ANeuralNetworksExecution*
的指针,函数可以像上面例子中一样,修改 ANeuralNetworksExecution*
本身,为其赋值一个新的数据。从而,当函数调用时,传入的是一个指向空的 ANeuralNetworksExecution*
指针。当函数返回时,调用者就得到了一个指向 ANeuralNetworksExecution
对象的指针。
调用者代码如下:
ANeuralNetworksExecution *execution;
int32_t status = ANeuralNetworksExecution_create(compilation_, &execution);