
请教c语言
voidfun(char*a,char*b){a=b;(*a)++;}main(){charc1='A',c2='a',*p1,*p2;p1=&c1;p2=&c2;fun...
void fun(char *a,char*b)
{
a=b;(*a)++;
}
main()
{
char c1='A',c2='a',*p1,*p2;
p1=&c1;p2=&c2;fun(p1,p2);
printf("%c%c\n",c1,c2);
}
此程序中经过函数调用,指针p1为什么仍能指向'A',子函数中a=b应该将a指向指针b了,那为什么p1没有改变指向呢? 展开
{
a=b;(*a)++;
}
main()
{
char c1='A',c2='a',*p1,*p2;
p1=&c1;p2=&c2;fun(p1,p2);
printf("%c%c\n",c1,c2);
}
此程序中经过函数调用,指针p1为什么仍能指向'A',子函数中a=b应该将a指向指针b了,那为什么p1没有改变指向呢? 展开
5个回答
展开全部
指针这东西很微妙,C语言函数之间的传递有两种形式,一种是“值”传递,另一个是“地址”传递也就是通常所说的“指针”传递,但实质上还是一种“值”的传递只不过它传递的不是一个简单的值而是传递的是一个地址!理解了这里,下面我们来解题,在main函数中将指针p1指向A的地址,指针p2指向a的地址,传递给函数fun的时候你想想这里是什么传递??(这里是地址传递,将A和a的地址传递给函数fun),而在函数fun中有两个char类型的局部指针变量(形参),一个指向A另一个指向a(即变量a指向A的地址,变量b指向a的地址),执行语句a=b;时,只是将变量a的指向改变了,它指向了变量b指向的内容,所以这里变量a也指向了a的地址,即变量a和变量b都指向a的地址!执行语句(*a)++;先拿出指针变量a所指向的值,在将该值自加1,此时变量a和变量b所指向的值是字母‘b’。而p1和p2还是指向原来的地址即p1指向字母‘A’p2指向字母‘a’,所以p1没有变化,程序执行的结果是Ab。谭老爷子那本书上应该有类似的例题
追问
地址传递时形参和实参不是共用空间的吗,类似数组,改变形参,实参也该跟着改变的吗?
追答
这个问题问得好,地址传递确实是形参和实参共用空间,但要看共用什么空间,他们是共用实参指向的空间,也就是这里的变量c1和c2的空间,变量c1和c2的空间传递给函数fun,在函数fun内由char类型的指针变量来接受即指针变量a指向了c1的地址,指针变量b指向了c2的地址。如果直接改变变量a、b的值那么c1和c2的值一定会改变,但是你做了一个操作a=b;问题就出在这个操作里,在函数中你有将指针变量a的指向指向了另一个空间b也就是c2的地址此时a已经不在指向c1的地址而是与b一样指向了c2的地址即*a==*b==c2;!!c1的空间已经没有指针变量指向它了,当你进行下一个操作时(*a)++;其实是改变了c2的内容,将b2自加1,把它翻译过来就是c2++;所以最后答案是Ab。而你所说的类似数组的东东,那是因为你没有改变它的指向!你可以对比一下你所说的类似数组的那个程序看看,其实数组传递也是指针传递,它传递的是数组的首地址
展开全部
p1 是指向c2 了呀,程序输出Ab 的嘛,就是p1指向c2,然后使a变成b的啊
你打印的语句没有用指针。
如果你加一条 printf("%c%c\n",*p1,*p2);
就会看到输出bb
哦,抱歉。理解错了。输出的还是Ab。
应该是这样。p1 和p2 指针的值,分别复制给了a 和b
a指向ch1 b指向ch2 然后a被指向了ch2
但这并不影响p1和p2 的值,因为他们的值是被复制过去的,本身不受影响
你打印的语句没有用指针。
如果你加一条 printf("%c%c\n",*p1,*p2);
就会看到输出bb
哦,抱歉。理解错了。输出的还是Ab。
应该是这样。p1 和p2 指针的值,分别复制给了a 和b
a指向ch1 b指向ch2 然后a被指向了ch2
但这并不影响p1和p2 的值,因为他们的值是被复制过去的,本身不受影响
追问
那你的意思是指针是传值了?可是一般不是应该传递地址吗?
追答
其实,传递都是传值。除非是传引用。
这里传的是指针,对指针来说,是传值。对char类型来说,是传的它们的地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在参数传递的过程中,p1指向的地址是以传值的方式传递,也就是并不会改变p1本身指向的地址,只是把p1指向的地址中的数字改变了
要是想达到你的效果,参数要是这样的void fun(char **a,char**b)
使用时fun(&p1,&p2);
要是想达到你的效果,参数要是这样的void fun(char **a,char**b)
使用时fun(&p1,&p2);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询