为了账号安全,请及时绑定邮箱和手机立即绑定

这个函数的输出相当于没什么变化,我大约知道是这个结果,求解释具体的原理= =

这个函数的输出相当于没什么变化,我大约知道是这个结果,求解释具体的原理= =

C PHP
哆啦的时光机 2022-07-27 16:15:33
#include<stdio.h>void changeSeason(char*);void main(){char *season[]={"Spring","Summer", "Autumn", "Winter"};char *ps=season[0];changeSeason(ps);printf("Now the season is %s",ps);}void changeSeason(char*p){p++;++p;}
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

都说是形式参数,被引用是不改变的
changeSeason被调用时 生成一个char* p 然后赋值让 p=ps
再然后,在函数里面对p进行什么操作都影响不了ps了,结果就没有什么变化

查看完整回答
反对 回复 2022-08-01
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

函数是值传递(单向传递,指针也是,即地址传递也是单向传递)
changeSeason(ps);将ps的地址传递给p
p++,p--是形参p的变化,与ps无关,
p是函数另外新建的指针变量(调用函数创建,函数结束释放)
类比int m,n=1;m=n; m++;不会影响n的变化一样。

但(*p)++就有影响了。因为p与ps指向地址相同,即"Spring"中‘S'的地址
*p与*ps就是字符'S',(*p)++等价于’S'++(当然本题中是错误的,‘S'常量不能++),传递地址的作用就体现在*p的用法上(可以改变传入地址指向的变量的值,相当于间接改变变量)。

查看完整回答
反对 回复 2022-08-01
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

当调用changeSeason(ps);,你可以理解为ps这个指针的值,新建了一个副本传给了(void changeSeason(char*p))这个里边的p,p是一个ps的副本,而不是ps本身,所以p怎么运算都没有改变ps这个值本身。
不过可以对ps指向的对象进行操作。不过这里你定义的数组不能用了。
#include<stdio.h>
void changeSeason(char*);
void main()
{
char season[]= {"Spring"};
char *ps=season;
changeSeason(ps);
printf("Now the season is %s",ps);
}
void changeSeason(char*p)
{
*p = 'A';
}
这个时候输出的结果是Apring


查看完整回答
反对 回复 2022-08-01
  • 3 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信