参考链接:http://www.2cto.com/kf/201202/120037.html
对于链接里提到问题,我做了总结如下:
从一个简单的例程开始,
char str1[]="hi";
char str2[]="hello";
void MyFun(char *pp)
{
pp = str2;
}
void main()
{
char *p=str1;
MyFun(p);
printf("%s\n",p);
}
程序目的是初始化指针指向str1,改变指针p指向的内容,让其指向str2,但运行结果为"hi",为什么?
下面就来一步一步调试吧
进入函数MyFun,执行pp=str2之前在内存中查看指针变量str1,str2,p,pp。
str1 | 0x00424a54 | 68 69 00 "hi" |
str2 | 0x00424a58 | 68 65 6c 6c 6f 00 "hello" |
&p | 0x0012ff7c | |
p | 0x00424a54 | |
*p | 0x68 'h' | |
&pp | 0x0012ff2c | |
pp | 0x00424a54 | |
*pp | 0x68 'h' |
执行pp=str2(这里是关键)
pp的的值变为0x00424a58
退出函数MyFun
p的值仍为0x00424a54
打印出的字符串"hi"
调试之后问题已经浮出水面了,执行pp=str2,改变的只是pp的值而不是p的值。
解决办法:
使用二维指针,传入p的地址,从而改变p的值。
代码如下:
char str1[]="hi";
char str2[]="hello";
void MyFun(char **pp)
{
*pp = str2;
}
void main()
{
char *p=str1;
MyFun(&p);
printf("%s\n",p);
}
运行打印出字符串"hello"
如果不明白其中的原因,那再来调试修改过的程序
进入函数MyFun,执行pp=str2之前在内存中查看指针变量str1,str2,p,pp。
str1 | 0x00424a54 | 68 69 00 "hi" |
str2 | 0x00424a58 | 68 65 6c 6c 6f 00 "hello" |
&p | 0x0012ff7c | |
p | 0x00424a54 | |
*p | 0x68 'h' | |
&pp | 0x0012ff2c | |
pp | 0x0012ff7c | |
*pp | 0x00424a54 | |
**pp | 0x68 ‘h’ |
注意,pp的值就是&p,所以*pp即p。
执行*pp=str2
*pp变为0x00424a58
退出函数MyFun
p的值也变为0x00424a58
故打印出字符串"hello"
对于链接中的问题,原理是一样的,不过是str2换成一个新开辟的空间的首地址罢了
链接里还提到的另外两种方法同样值得借鉴,感谢网友。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。