昨天看数据结构时,看到了一个在函数中修改指向的声明,如下:
- typedef struct List
- {
- int data;
- List *next;
- }sqList,*ListPtr;
void ChangePtr(ListPtr p1, ListPtr p2, ListPtr *p3);
它的作用是把p1,p2排序好后,把p3指向新排序好的序列。这时自己感觉应该都使用ListPtr指针就行了,为什么要定义成指针的指针的呢?
后来查了资料之后,说明如下:
函数传递一般是按值传递,也就是如果需要修改传进来的参数的值,就必需传递它的地址,如简单的:
- void modify(int i)
- {
- i = 5;
- }
- int main()
- {
- int i = 0;
- modify(&i);
- }
所以不管是传值呢,还是传指针,它们都是变量,如果要想在函数中改变它们的值,就得传递它们的地址,e.g:&i,ListPtr *p3(它其实就是地址的地址);
来个通俗点的例子:
- char na[10] = "world"
- void modify(char *p)
- {
- p = na;
- }
- int main()
- {
- char *p = NULL;
- modify(p);
- printf("%s",p);//打印出来应该还是空,不会是world.
- }
我们想在函数modify()中改变指针p的值(记住:是指针p的值,而不是p所指向的地址的值)。能实现吗?
结果是不能,为什么?我们来分析一下。
首先,函数的参数是char *p,我们可以改变 *p,但改变不了p本身。
说得易懂点就是,是把p改变了,但改变的是函数中的局部变量p,当函数结束时,局部p被释放了,其实也只是主函数p的一个拷贝,所以没有改变。
要想改变,就要用到上面所以写的方法,传递二维指针,例子修改一下,e.g:
- void modify(char **p)
- {
- *p = na;
- }
- int main()
- {
- char *p = NULL;
- modify(&p);
- printf("%s",p)//这回打印出来的就是world了。
- }
大家可以慢慢思考,呵呵,也可以用其它的方式,我就一起写出来吧,
如果大家感觉二维的太抽象,可以用函数返回值:
- void modify(char *p)
- {
- p = na;
- return p;
- }
- int main()
- {
- char *p = NULL;
- p = modify(p);
- }
或者引用也可以,这个就不写了,都非学简单。