1,使用指针的指针和指针的引用的原因
当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来的值。我们用下边的代码说明一下问题:
int m_value = 1;
void func(int *p)
{
p = &m_value;
}
int main(int argc, char *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn <<endl;
return 0;
}
看一下输出结果
输出的是两个2。
结论:
1. 函数的返回值是指针类型的,检查是静态内存指针还是堆内存指针还是栈内存指针,栈内存指针是绝对要不得滴!
2. 函数需要使用指针参数进行传入传出的,在函数中只能对指针的指向的值(*p)进行修改,而不能修改指针指向,也就是指针地址!(函数中不得修改指针参数的地址,否则请使用指针的指针!)
使用指针的指针
展示一下使用指针的指针做为参数:
int m_value = 1;
void func(int **p)
{
*p = &m_value;
// 也可以根据你的需求分配内存
*p = new int;
**p = 5;
}
int main(int argc, char *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(&pn);
cout << *pn <<endl;
return 0;
}
输出2 和5
我们看一下 func(int **p)这个方法
p: 是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
*p: 是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
**p: 两次解引用是指向main()方法里*pn的内容
指针的引用
nt m_value = 1;
void func(int *&p)
{
p = &m_value;
// 也可以根据你的需求分配内存
p = new int;
*p = 5;
}
int main(int argc, char *argv[])
{
int n = 2;
int *pn = &n;
cout << *pn << endl;
func(pn);
cout << *pn <<endl;
return 0;
}
输出还是2和5
看一下func(int *&p)方法
p: 是指针的引用,main()方法里的 *pn
*p:是main()方法里的pn指向的内容。
/这部分是关于指针的引用&的说明*、
指针的引用,相当于传递的是: 指针的指针, 这样指针的数值是可以改变的
而单传递指针,不传递指针的引用,那么指针指向的数据是可以改变,而指针本身是不可以改变的
fun(int * pA); // pA的数值在函数返回后不会变化
fun(int*& pA); // pA的数值在函数返回可能会发生变化,如果fun函数内部对pA赋值的话
void InitStack(LNode* & HS)
{
HS = NULL; // 函数返回后, HS就是NULL了
}
void InitStack(LNode* HS)
{
HS = NULL; // 函数返回后, HS依然是传递进来的数值
}
*/
By Northow:
简单讲,*&指针本身可变;
*指针本身不变,仅指向的内容可变。