指针的指针和指针的引用
2017-02-13 11:38
134 查看
1,使用指针的指针和指针的引用的原因
当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来的值。我们用下边的代码说明一下问题:
看一下输出结果
输出的是两个2。
结论:
1. 函数的返回值是指针类型的,检查是静态内存指针还是堆内存指针还是栈内存指针,栈内存指针是绝对要不得滴!
2. 函数需要使用指针参数进行传入传出的,在函数中只能对指针的指向的值(*p)进行修改,而不能修改指针指向,也就是指针地址!(函数中不得修改指针参数的地址,否则请使用指针的指针!)
输出2 和5
我们看一下 func(int **p)这个方法
p: 是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
*p: 是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
**p: 两次解引用是指向main()方法里*pn的内容
输出还是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/
当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的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/
相关文章推荐
- 指针和引用的区别总结
- 关于C中指针的引用,解引用与脱去解引用
- 指针内容的引用
- 指针与引用的区别
- 指针与引用
- C++ 传指针还是引用?
- 指针和引用有什么区别
- 传值&传引用&传指针
- 智能指针 安全引用的实现
- 引用与指针
- 指针与引用的区别
- C++中,虚函数,引用指针,拷贝复制等知识点总结
- 指针和引用
- 指针和引用
- C++中值传递、指针传递和引用传递的比较
- c++中函数参数传递(值传递、指针传递,引用传递)
- c++中,引用和指针的区别
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- 妹子与汉子――引用与指针的区别(1)
- C++编程实例-数组、指针及引用