这是我的一些二重指针的一些经验,希望对大家有帮助,如有啥错误或者更好的想法希望能指出,共同进步,谢谢
#include<stdio.h>
void change(int *p) //函数参数为整形指针,p = v,即 p和v都指向变量num
{
*p = 2; //修改*p的值也修改了num的值
printf("p = %d\n",*p);
}
int main()
{
int num = 1; //声明一个整形变量num
int* v = # //令指针v指向num变量
printf("num1 = %d\n",num); //输出num的值
change(v); //调用函数
printf("num2 = %d\n",num); //输出函数调用的num变量
return 0;
}
编译结果是num1 = 1,p = 2,num2 = 2
通过以上代码可以看出,通过调用函数实现改变了num的值,是通过在函数里面创建一个新的指针指向num,从而修改num的值并没有改变指针v的指向,v还是指向num。
#include<stdio.h>
void change(char *p)
{
p = "bbb"; //令字符型指针p指向字符串"bbb"
printf("p = %s\n",p);
}
int main()
{
char *v = "aaa"; //创建字符型指针,指向"aaa"这个字符串
printf("v1 = %s\n",v);//使用v而不是用*v的原因是,v没有对变量进行引用,而是字符串的首元素的地址
change(v);
printf("v2 = %s\n",v);
return 0;
}
编译结果:v1 = aaa,p = bbb,v2 = aaa
编译结果与预期不符,以为v2会是"bbb",却与意向的结果不一致。原因是在change函数里把指针v赋值给指针p,然后指针p又指向了"bbb",所以指针v还是指向"aaa"
把上述代码做一个小小的修改如下
#include<stdio.h>
void change(char **p)
{
*p = "bbb";
printf("p = %s\n",*p);
}
int main()
{
char *v = "aaa";
printf("v1 = %s\n",v);
change(&v); //传入指针v的地址
printf("v2 = %s\n",v);
return 0;
}
编译结果:v1 = aaa,p = bbb,v2 = bbb
在change函数中,声明了一个双重指针p,p是指向指针的指针,他存放着指针的地址,在本例中,p也就存放着指针v的地址,p也就是指针v,即p = v。函数change中*p = “bbb"也就等于v = “bbb”。
指针v指向了字符串"bbb”,不再指向字符串"aaa",真正实现改变了指针的值
由此总结,当想用函数改变指针的指向时,函数参数应该是双重指针。当想用函数改变指针指向的元素的内容时,函数参数是指针就可了