c++中能不能通过函数改变实参指针,能的话请举个栗子,谢谢
4个回答
展开全部
不太清楚你说的概念,不过可以尝试给你解释,看是否符合你的要求。
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。
(这个技巧比较晦涩,虽然可以用于返回值的一种写法。不过的确太过晦涩,而且有更容易理解的方式来完成。)
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取其地址
追答
呵呵,如果按照一楼的说法,二级指针的做法。不满足你的要求呀。
虽然改变外部指针的值,但那个值不是实参。实参是指传入的那个变量。
是不是有点绕?
展开全部
可以,你可以在传递参数的时候传递指针的指针,或者传递指针的引用。
比如:
int* p;
如果你想在函数里面改变 p 可以这样声明函数:
void FuncName(int** a);
或者:void FuncName( (int*) &a );
前者调用的时候可以这样: FuncName(&p);
后者这样调用: FuncName(p);
比如:
int* p;
如果你想在函数里面改变 p 可以这样声明函数:
void FuncName(int** a);
或者:void FuncName( (int*) &a );
前者调用的时候可以这样: FuncName(&p);
后者这样调用: FuncName(p);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只能通过指向指针的指针才能实现你想要的功能。
原因:C++的函数参数实现机制导致的。函数参数通过传值来实现,不是通过传址来实现。
因此只能通过指向指针的指针来实现你想要的功能。
原因:C++的函数参数实现机制导致的。函数参数通过传值来实现,不是通过传址来实现。
因此只能通过指向指针的指针来实现你想要的功能。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
点击(此处)折叠或打开
/*错误的实现*/
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);
望采纳 谢谢
/*错误的实现*/
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);
望采纳 谢谢
追问
不明觉厉
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询