问题描述
- 小白问个关于C指针的问题
- point(char *p)
{
p+=3;
}
main()
{ char b[4]={'m''n''o''p'}*pt=b;
point(pt);
printf(""%cn""*pt);
}本以为答案是p,但是为什么是m?
答案解释是因为这次调用函数是值传递而不是址传递,为何?(*p)+3倒是可以输出p,但是为什么呢?不用函数调用,使用p+3也可以输出p。函数调用到底发生了什么,用指针好迷糊。
解决方案
应该这样理解,把指针传递,传递的是指针的地址,p是地址,可以认为是形参,它是你传入的那个指针地址的一个副本,所以改变*p时,指针指向的内容也会改变。
但是如果 改变指针的地址,比如这里的p+改变以形参,实参是不会发生改变的
解决方案二:
如果你想改变pt的值变成'p',你应该把这样:
point(char **p)
{
p+=3;
}
main()
{ char b[4]={'m''n''o''p'};
char *pt=b;
point(&pt);
printf(""%cn""*pt);
}
这样就能改变指针的值。
解决方案三:
你需要得到m,有两个写法
(1)
point(char &*p)
(2)
*p='m';
解决方案四:
在point()里只可以改变*p,不可以改变p,所以那个p+=3相当于没用。
解决方案五:
(1)你传指针的引用,会改变实参的指针
(2)你修改指针,不会影响实参的指针。但是修改指针指向的内容会影响原来的数组。
解决方案六:
point()函数调用时将pt的形参传递过去,不会影响实参的值,也就是说无论point()函数内部怎么改变,变量的作用范围是函数的内部。
解决方案七:
point函数只能修改p指向的内容,对于指针本身修改的是拷贝,所以无效,你需要传char**二级指针
解决方案八:
当年学指针那叫一个痛苦啊。指针修改不会改变实参。
解决方案九:
在main里边这么调用: point(*pt)
时间: 2024-11-01 05:27:35