您的位置:首页 > 编程语言 > C语言/C++

指针的指针和指针的引用

2017-02-13 11:38 134 查看
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:

简单讲,*&指针本身可变;

*指针本身不变,仅指向的内容可变。

参考:http://www.cnblogs.com/li-peng/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息