写哪儿指哪儿——值传递

时至今日还在纠结这类问题,实在是惭愧……

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;
}

posted @ 2015-07-20 15:32  Garcia-0  阅读(97)  评论(1编辑  收藏  举报