昨天看数据结构时,看到了一个在函数中修改指向的声明,如下:

 

 
  
  1. typedef struct List 
  2.     int data; 
  3.     List *next; 
  4. }sqList,*ListPtr; 

void ChangePtr(ListPtr p1, ListPtr p2, ListPtr *p3);

它的作用是把p1,p2排序好后,把p3指向新排序好的序列。这时自己感觉应该都使用ListPtr指针就行了,为什么要定义成指针的指针的呢?

 

后来查了资料之后,说明如下:

函数传递一般是按值传递,也就是如果需要修改传进来的参数的值,就必需传递它的地址,如简单的:

 

 
  
  1. void modify(int i) 
  2.     i = 5
  3. int main() 
  4.     int i = 0
  5.     modify(&i); 

所以不管是传值呢,还是传指针,它们都是变量,如果要想在函数中改变它们的值,就得传递它们的地址,e.g:&i,ListPtr *p3(它其实就是地址的地址);

来个通俗点的例子:

 

 
  
  1. char na[10] = "world" 
  2. void modify(char *p) 
  3.     p = na; 
  4. int main() 
  5.     char *p = NULL; 
  6.     modify(p); 
  7. printf("%s",p);//打印出来应该还是空,不会是world.

我们想在函数modify()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?
结果是不能,为什么?我们来分析一下。

首先,函数的参数是char *p,我们可以改变 *p,但改变不了p本身。

说得易懂点就是,是把p改变了,但改变的是函数中的局部变量p,当函数结束时,局部p被释放了,其实也只是主函数p的一个拷贝,所以没有改变。

要想改变,就要用到上面所以写的方法,传递二维指针,例子修改一下,e.g:

 

 
  
  1. void modify(char **p) 
  2.     *p = na; 
  3. int main() 
  4.     char *p = NULL; 
  5.     modify(&p); 
  6.     printf("%s",p)//这回打印出来的就是world了。 

大家可以慢慢思考,呵呵,也可以用其它的方式,我就一起写出来吧,

如果大家感觉二维的太抽象,可以用函数返回值:

 

 
  
  1. void modify(char *p) 
  2.     p = na; 
  3.     return p; 
  4. int main() 
  5.     char *p = NULL; 
  6.     p = modify(p); 

或者引用也可以,这个就不写了,都非学简单。