- p: 是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
- *p: 是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
- **p: 两次解引用是指向main()方法里*pn的内容
int value = 3;
void func(int **p)
{
*p = &value;
}
void func(int *&p)
{
p = &value;
}
int _tmain(int argc, _TCHAR* argv[])
{
#if 0
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn << endl;
#else
int n = 1;
int *pn = &n;
cout << *pn << endl;
func(&pn);
cout << *pn <<endl;
#endif
getchar();
return 0;
}
int *&p 实际上,本质p是一个引用,对一个指针的引用,所以对p的修改实际上就是对指针的修改。这里在从新认识指针 int *p,本质为地址的地址,也就是说p指针中放的是一个地址,本身p也有一个地址。所以当int *& p初始化之后那么p指向的地址就不会改变,也就是存放地址的内存空间。但是这里面放的内容可以改变,这就是引用的特点,在这里实际上就是里面放的地址可以改变。
引用运行结果:
int *p 本质为地址的地址,也就是说,p指向了一个内存空间,里面放了一个地址。如果我们通过值传递,将直接传递给函数,那么内部的副本不会改变p本身。类似于在函数外部是int *p,在内部是int * tmpp,两者里面放的内容是一样的,也就是真是的地址,但是两者本身的地址是不一样的,对tmpp的修改不会作用到p上。 使用指针的指针,可以做到这点。int **p;在函数内部首先解引用,实际上就得到了p的真是地址,从而可以对p本身进行修改。
指针的指针运行结果: