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

C++ 指针作为函数参数介绍

2009-12-20 05:47 204 查看
在学习指针的时候,我们可能会遇到费解的问题。假设我们有如下一段代码:

void getptr(int *_p,int num)
{
_p=(int *)malloc(num*sizeof(int));
}

void main()
{
int *ptr=NULL;
int k;
getptr(ptr,10);
}

我们想通过以上代码来为ptr分配内存,结果如何呢,大家可以试一下,肯定是失败的。同样还有下面一段代码来实现上面所述功能。

void getptr(int **_p,int num)
{
*_p=(int *)malloc(num*sizeof(int));
}

void main()
{
int *ptr=NULL;

int **p=&ptr;
getptr(p,10);
}

第2段代码可以实现为ptr动态分配内存。与第一段相比,我们首先会有一个疑问:指针作为函数参数传递时,传递的不是当前指针本身?当然,指针作为形参时,传递的是当前指针的一个副本,否则第一段代码就可以啦。先说第一段代码,"传递"p的时候会生成副本_p,_p和p是两个不同的指针变量,但它们指向同一个数据。因此,第一段代码不能为ptr分配内存,而是为其副本分配了内存。

正确的做法可以用第2段代码,因为副本和原本指向同一个数据,那我们可以把ptr作为数据,也就是把ptr封装在一指针里面,即使用二维指针int **p=&ptr。到此,大家可以理解指针作为函数参数的传递过程了。而且既然指针被传到函数里面了,还有什么不能做的呢。

说些题外话,有些人爱多想,既然原本和副本指向同一块数据,那可以在数据上做点文章。如果能想到这,说明你是一个会学习的人,不错。但要提醒大家,首先要搞清楚char *p="abc"的原理,我可以告诉大家结论,但还是希望能自己多去google。char *p="abc"等同于 const char *p="abc",也就是不可以通过p来改"abc"了。所以当你想操作数据时,有时候会读,有时候既可以读又可以写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: