c++中能不能通过函数改变实参指针,能的话请举个栗子,谢谢

 我来答
xingyunbuzui
2013-09-10 · TA获得超过1160个赞
知道小有建树答主
回答量:346
采纳率:100%
帮助的人:382万
展开全部
不太清楚你说的概念,不过可以尝试给你解释,看是否符合你的要求。

1 每一次函数调用,系统是在运行栈上进行压栈,并且把参数进行压栈处理。
2 换句话说,形参的存储空间是在压栈时在栈空间分配的,并且在函数退出后,通过退栈清除。
3 并且在形参压栈时,将实参的值赋值(copy)给对应形参。
4 所以,通常意义上函数内部无法改变实参的指针。

但是有一些技巧可以曲线完成你要的效果,例如实参是指针,其值是自身的地址。那么相当与一个二级指针的访问。
这样就可以通过这种方式修改实参的指针。
例如:

void fun(char* p) {
char** x = (char**) p;
*x = malloc(9);
strcpy(*x,'success');
}
int main(){
char* p;
p = &p;
fun(p);
printf("%s\n", p);
}

上面这个例子,函数fun不仅仅改变了传入实参的地址值,而且还给它赋值了success。
(这个技巧比较晦涩,虽然可以用于返回值的一种写法。不过的确太过晦涩,而且有更容易理解的方式来完成。)
更多追问追答
追问
谢谢,感觉您说的挺对的,不过我感觉一楼说的更简洁,而且没有必要使p取其地址
追答
呵呵,如果按照一楼的说法,二级指针的做法。不满足你的要求呀。
虽然改变外部指针的值,但那个值不是实参。实参是指传入的那个变量。
是不是有点绕?
百度网友006959291
2013-09-10 · TA获得超过222个赞
知道答主
回答量:198
采纳率:0%
帮助的人:178万
展开全部
可以,你可以在传递参数的时候传递指针的指针,或者传递指针的引用。
比如:
int* p;

如果你想在函数里面改变 p 可以这样声明函数:
void FuncName(int** a);
或者:void FuncName( (int*) &a );

前者调用的时候可以这样: FuncName(&p);
后者这样调用: FuncName(p);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sfft_stom
2013-09-10
知道答主
回答量:3
采纳率:0%
帮助的人:4175
展开全部
只能通过指向指针的指针才能实现你想要的功能。
原因:C++的函数参数实现机制导致的。函数参数通过传值来实现,不是通过传址来实现。
因此只能通过指向指针的指针来实现你想要的功能。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小红马的店铺
2013-09-10 · TA获得超过2593个赞
知道小有建树答主
回答量:609
采纳率:75%
帮助的人:230万
展开全部
点击(此处)折叠或打开
/*错误的实现*/
void getmemory(int *ptr,int size)
{
ptr = (int *)malloc(sizeof(int)*size);
}

/*返回值类型*/
int * getmemory(int size)
{
int *temp = (int *)malloc(sizeof(int)*size);
if(temp != NULL)
{
return temp;
}
return NULL;
}

/*指向指针的指针*/
void getMemory(int **buf,int size)
{
*buf = (int *)malloc(sizeof(int)*size);
}

个人感觉第二种好点

/*返回值式的链表更新表头操作*/
head = insert_listnode(head,value);

/*自动更新的操作*/
insert_listnode(*head,value);

望采纳 谢谢
追问
不明觉厉
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式