为什么这个程序的结果还是A
为什么这个程序的结果还是A
point(char *p)
{
p+=3;
}
main()
{ char b[4]={’a’,’b’,’c’,’d’},*p=b;
point(p); printf( "%c\n ",*p);
}
为什么不是d而是a
[解决办法]
你参数传过去后,point(char *p)内的p是main()内p的复制值,point内改变的只是个复制值,main()内的
数据没任何改变.
[解决办法]
void point(char *p)
{
p+=3;//局部参量分配在堆栈,函数结束释放
}
main()
{
char b[4]={’a’,’b’,’c’,’d’},
*p=b;//1
point(p); //2 没有改变p的值
printf( "%c\n ",*p);仍然用的是1处的p
}
[解决办法]
传地址 只能保存对地址所指内存的改变;并不能保存对指针本身的改变;如果你要改变一级指针;则用二级指针做参数;
[解决办法]
楼上说的都对,这样些的代码能满足你的要求:
#include <stdio.h>
void point(char *p)
{
*p+=3;
}
main()
{ char b[4]={ 'a ', 'b ', 'c ', 'd '},*p=b;
point(p); printf( "%c\n ",*p);
}
这样指针所在的地址没有变,所以point 和 main 里的指针所指向的地址一致;*p+=3; 后指针指向的地址变了,变成了 'd '的地址。因为point 和 main 里的指针所指向的地址一致,都指向了 'd '。
[解决办法]
p += 3;改变的是指针‘的’地址,而不是改变指针‘指向的’地址;*p += 3 反之
[解决办法]
CXBID() 做到的只是内容的加也即 'a '+3,不管怎么样都是d(即使数组最后一个元素是'e',它也输出 'd ',我要改的是地址的改变
char* CWage::point(char* p)
{
p +=3;
return p;
}
char b[4]={ 'a ', 'b ', 'c ', 'e '};
char *p = b;
p=wage.point(p);
printf( "%c\n ",*p);
[解决办法]
堆栈问题/传值传址问题
如果你想在下级函数里修改该指针的值,就必须通过返回值返回,或者传入指向该指针的指针
[解决办法]
#include <stdio.h>
#include <stdlib.h>
void point(char **p)
{
(*p) += 3;
return;
}
void main()
{
char b[4]={ 'a ', 'b ', 'c ', 'd '};
char *p=b;
point(&p);
printf( "%c\n ",*p);
system( "pause ");
return;
}
代码尽量不要有警告
主要是函数返回是指针,所以必须传递指针的地址进去
如果传的是指针,则调用的时候创建了一个临时的char *类型
返回的时候已经释放,所以*p当然不变了