指针的指针和指针的引用

来源:互联网 发布:淘宝退货金额改0元吗 编辑:程序博客网 时间:2024/05/16 04:05

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/

0 0
原创粉丝点击