您的位置:首页 > 其它

写哪儿指哪儿——值传递

2015-07-20 15:32 288 查看
时至今日还在纠结这类问题,实在是惭愧……

C/C++的参数是值传递。也就是说形参(仅在该函数内部可以访问)只是实参的一份拷贝。

通常,为了改变一个数值,我们传入指向这个数值的指针,函数体内改变这个指针的指向,从而改变对应数值。

void swap(int *p, int *q)
{
int tmp = *p;
*p = *q;
*q = tmp;
}

int main () {
int a = 1, b = 2;
swap(&a,&b);
return 0;
}

这样或许更直观:

int main () {
int a = 1, b = 2;
int *p,*q;
p = &a;
q = &b;
printf("%d %d\n",*p,*q); // 1 2

swap(p,q);
printf("%d %d\n",*p,*q); // 2 1
return 0;
}

改变指针的值?

现在有个函数要改变一个指针,一开始,我写成了这样:

void pointToRoot(int *root, int *q)
{
q = root;
}

int main () {
int a = 1, b = 2;
int *root,*q;
root = &a;
q = &b;
printf("%d %d\n",*root,*q); //1 2

pointToRoot(root,q);
printf("%d %d\n",*root,*q); //1 2
return 0;
}

虽然在函数pointToRoot里改了q的值,但是改的是形参,对main里q并没有效果。

我们要改指针q,那么我们需要传入的参数就应该是指向指针q的指针&q,在函数pointToRoot里改变&q指向的值:

void pointToRoot(int *root, int **q_ref)
{
*q_ref = root;
}

int main () {
int a = 1, b = 2;
int *root,*q;
root = &a;
q = &b;
printf("%d %d\n",*root,*q);  //1 2

pointToRoot(root,&q);
printf("%d %d\n",*root,*q);  //1 1

*root = 3;
printf("%d %d\n",*root,*q);  //3 3
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: