看下面一段程序:
环境:VC++6.0
void a ( char *a )
{
a++;
}
void main()
{
char *p ="ABC";
a (p);
printf(p);
}
想要的效果是指针指向ABC字符串首字符A,经过A函数之后改变P指针指向下一个字符B。结果失败了。
结果:
ABC
函数a只是拷贝了p的值(A的内存地址)过去作自加,并没有对p本身作修改。因此,当打印P的时候并不是BC而是ABC。
修改程序如下:
void a ( char **a )
{
(* a) ++;
}
void main()
{
char *p ="ABC";
a (&p);
printf(p);
}
结果:
BC
函数a拷贝了P的内存地址,把该内存地址上的值即P(P保存了字符串的首地址)作自加,因此P指向了下一个字符B。
环境:VS2005
- #include "stdafx.h"
- void aa ( char **a )
- {
- (*a) ++;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char *p ="ABC";
- aa (&p);
- printf(p);
- getchar();
- return 0;
- }
给函数传递地址时使用指针变量,改变指针的值时使用双指针。P保存的是A的内存地址,*P取的是该地址上的值即A,&P为保存P的内存地址。