为什么需要使用2级指针(转载)
来源:互联网 发布:8月份信贷数据 编辑:程序博客网 时间:2024/06/14 16:23
原地址为 http://blog.163.com/xubin_3@126/blog/static/112987702200952392534107/
回答一:
通常情况下你想通过函数参数获取一段动态分配的内存时需要用到,比如:
bool GetMemory(int **lpData)
{
*lpData = new int [100];
memset(*lpData, 0, 100);
if (lpData != NULL)
return true;
else
return false;
}
void main(void)
{
int *lpData = NULL;
if (GetMemory(&lpData))
{
for (int i = 0; i < 100; i++)
lpData[i] = i;
}
回答二:
1) 工厂函数的参数
struct Obj {};
void CreateOneObj(Obj** p)
{
*p = new Obj;
}
2) 2唯动态数组
int** a = new int*[100};
回答三:
明确这点:用指针也就是传递的是地址,说明你想改变被指对象的值
那么你就知道用指针的指针是什么目的了吧
当然,也可以用指针的引用来代替指针的指针
回答四:
比如你想在函数中改变了一个传入的指针,而你又想通过参数返回这个指针那么你就要用到指针的指针了
回答五:
比如当你需要改变两个指针的指向,而你又想通过参数返回这个指针:可以有2中方法:
可以参考我的一个验证性程序中的方法四:
//本程序用来测试几种交换两个指针的指向的方法,其中方法二和方法四是可行的
#include <iostream>
using std::cout;
using std::endl;
void swappoint1(int *p1,int *p2) //方法一:传值和传地址的区别要看你对实参的那个形式进行操作
{ int *temp=p1; //如果你对*p1和* p2进行操作的话,没有改变p1和 p2的指向,只是改变的是他们
p1=p2; //所指存储区的值,此时看成是传指针哈。但是如果对p1和p2进行操作,因为p1和p2
p2=temp; //本身是存储区的地址,可以看成是传值的形式,此时不能改变p1和p2的指向。
} //相信方法一是大多人都错误做法哈
void swappoint2(int*&p1,int * &p2) //方法二:采用指针的引用作为实参,那么传的就是指针本身的地址
{ int *temp=p1; //即传的是左值,可以改变实参的地址和值,那么对p1和p2的操作就可以改变它们的
p1=p2; //指向,所以方法二有效
p2=temp;
}
void swappoint3(int**p1,int **p2)//方法三:采用指针的指针作为实参,这样的话,但是对与p1与p2进行
{
int ** temp=p1; //操作来说,同方法一的解释,此时看成传值,故不能改变p1和p2的指向
p1=p2; //故方法三是错误的
p2=temp;
}
void swappoint4(int **p1,int **p2)//方法四:采用指针的指针作为实参,与方法三相反,此时对*p1和*p2的
{ //操作是对** 的下层操作,看成是传指针哈,所以是有效的
int *temp=*p1;
*p1=*p2;
*p2=temp;
}
void main()
{
int a=1,b=2;
int *p1=&a,*p2=&b;
int **q1=&p1,**q2=&p2;
cout < < "用swappoint1函数交换两个指针之前的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
swappoint1(p1,p2);
cout < < "用swappoint1函数交换两个指针之后的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
cout < < "用swappoint2函数交换两个指针之前的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
swappoint2(p1,p2);
cout < < "用swappoint2函数交换两个指针之后的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
cout < < "用swappoint3函数交换两个指针之前的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
swappoint3(q1,q2);
cout < < "用swappoint3函数交换两个指针之后的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
cout < < "用swappoint4函数交换两个指针之前的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
swappoint4(q1,q2);
cout < < "用swappoint4函数交换两个指针之后的值:\n " < < "*p1= " < <*p1 < < "\n " < < "*p= " < <*p2 < < "\na= " < <a < < "\nb= " < <b < <endl;
}
//但是如果只要改变两个指针所指的存储区的值的话,对于方法一:可以对*p1和*p2操作,结果是改变a与b的值
//对与方法三:可以对**p1和**p2进行操作,结果是改变了a 与b 的值。
//而本程序的目的是改变指针的指向来交换值,但是a与b本身的值并没有改变。
- 为什么需要使用2级指针(转载)
- C++ 为什么要使用指针(需要再总结一下)
- 为什么需要异常处理(转载)
- c++为什么需要指针
- 为什么有时我们需要配置hosts文件呢?(转载)
- 为什么需要使用MQ?
- 为什么需要使用MQ?
- 为什么需要使用zeromq
- 空指针为什么能调用成员函数?(转载)
- 空指针为什么能调用成员函数?(转载)
- 为什么要学习指针(转载自知乎)
- 为什么使用双重指针
- 为什么使用指针
- 为什么使用指针
- 为什么使用双重指针
- 为什么使用二级指针
- 为什么使用指针
- 为什么要使用指针
- linux kill all proccess
- 关于CSS在IE6以下浏览器不支持:hover伪类的解决方式
- 【设置】保存表时,受到阻止
- 最大公约数--char4
- [WinForm]dataGridView背景色交替
- 为什么需要使用2级指针(转载)
- Understanding ANTLR Grammar Files
- 自定义WM_NOTIFY消息
- Linux 2.6.32的内核栈和用户空间栈关系
- linux下查找字符串命令
- hdoj1897 SnowWolf's Wine Shop (multiset)
- Java获取N天前,N天后的日期(如3天)
- Linux内核中常见内存分配函数
- 过滤器、监听器、拦截器的区别