C语言被调函数与主调函数数值问题
有一个题是交换a,b的值输出,被调函数是swap(inta,intb){intt;t=a;a=b;b=t;}老师说不对,被调函数改变的是它自己的值,主函数的还是不变,要改...
有一个题是交换a,b的值输出,被调函数是
swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
老师说不对,被调函数改变的是它自己的值,主函数的还是不变,要改地址才行(这个我明白)。可是后来又有一个例子,主函数里定义了a[10]的十个值,但是被调函数里又重新定义了a[0]等于别的数,然后输出的时候a[0]就成了被调函数里定义的那个。这是为什么啊?
PS:因为怕没有我想要的的答案,就先少给点分,到时候可以在追加的。 展开
swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
老师说不对,被调函数改变的是它自己的值,主函数的还是不变,要改地址才行(这个我明白)。可是后来又有一个例子,主函数里定义了a[10]的十个值,但是被调函数里又重新定义了a[0]等于别的数,然后输出的时候a[0]就成了被调函数里定义的那个。这是为什么啊?
PS:因为怕没有我想要的的答案,就先少给点分,到时候可以在追加的。 展开
11个回答
展开全部
参数有值传递和引用传递两种(你用的都是值传递)
值传递的意思是将你的参数的数值传递到调用的函数中(你的参数的值被复制了一份给了被调用的函数),所以才函数中怎么改变,都不会对原数值产生影响(打个比方,你抄袭了一篇文章,然后自己在那里改啊改的,但是原来的文章是没有动的)
后边定义的a[10]传递过去了为什么改了呢,这个是因为他是个数组,传递进去的不是数值,而是个指针,这个时候,在函数中,你修改指针的值,外边是不会有影响的,但是,你修改的是指针指向的地址的值,外边的指针指向的地址里的数据被改了,所以外边的数据就更改了
(就相当于你家里有个电视,你家里有个遥控,你弄了个一模一样的遥控,你把你的遥控甩坏了,家里的遥控还是不会有影响,但是你用遥控把电视的频道改了,这就受影响了)
值传递的意思是将你的参数的数值传递到调用的函数中(你的参数的值被复制了一份给了被调用的函数),所以才函数中怎么改变,都不会对原数值产生影响(打个比方,你抄袭了一篇文章,然后自己在那里改啊改的,但是原来的文章是没有动的)
后边定义的a[10]传递过去了为什么改了呢,这个是因为他是个数组,传递进去的不是数值,而是个指针,这个时候,在函数中,你修改指针的值,外边是不会有影响的,但是,你修改的是指针指向的地址的值,外边的指针指向的地址里的数据被改了,所以外边的数据就更改了
(就相当于你家里有个电视,你家里有个遥控,你弄了个一模一样的遥控,你把你的遥控甩坏了,家里的遥控还是不会有影响,但是你用遥控把电视的频道改了,这就受影响了)
2012-11-16
展开全部
函数的传参问题。
楼主所说的第二种情况,参数为数组时,其实传入被调函数中的是数组的首地址,a[0] = 3; 改变了a地址中存放的数据本身,即主函数中定义的数组a中的第一个元素。
介意楼主看一下函数的传参的相关知识
楼主所说的第二种情况,参数为数组时,其实传入被调函数中的是数组的首地址,a[0] = 3; 改变了a地址中存放的数据本身,即主函数中定义的数组a中的第一个元素。
介意楼主看一下函数的传参的相关知识
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
然后输出的时候a[0]就成了被调函数里定义的那个 因为你在主函数定义的数组传递给被调函数,本身就是把地址传递给被调函数。而你上面那个代码 在被调函数里面确实交换了2个的值,但是返回给调用函数的时候,值没被交换。理由很简单,你只是值赋予了被调函数的参数,里面的参数与你实际的传递实参没有间接关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为c语言中的数组是以首地址为始的一片连续空间 所以你对数组中某个数赋值的实质就是对处在一个特定地址空间的变量赋值 当然它在子函数与原函数之间都是可以被改编的 但普通变量在子函数中再次出现时 它不对应与原来的地址 故而改变之后没有影响 c的指针 或者说地址的操作 是它最卓越的地方 好好领悟吧~ 望采纳~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
# include "stdio.h"
void f(int a[])//参数是数组名a,a其实是个地址,即指针
{
a[0] = 555;//等价于* (a + 0) = 555
}
int main(void)
{
int a[5] = {1,2,3,4,5};
f(a);
printf("%d\n",a[0]);
return 0;
}
/*
输出结果:
------------------------
555
Press any key to continue
------------------------------
*/
void f(int a[])//参数是数组名a,a其实是个地址,即指针
{
a[0] = 555;//等价于* (a + 0) = 555
}
int main(void)
{
int a[5] = {1,2,3,4,5};
f(a);
printf("%d\n",a[0]);
return 0;
}
/*
输出结果:
------------------------
555
Press any key to continue
------------------------------
*/
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询