形参不能改变实参,为什么在用指针传递数值的时候又可以改变呢?
形参不能改变实参,为什么在用指针传递数值的时候又可以改变呢?帮忙解释一下!谢谢!voidswap(int*a,int*b){intt;printf("(2)*a=%d*b...
形参不能改变实参,为什么在用指针传递数值的时候又可以改变呢?帮忙解释一下!谢谢
!
void swap(int *a,int *b)
{int t;
printf("(2)*a=%d *b=%d",*a,*b);
t=*a;*a=*b;*b=t;
printf("(3)*a=%d *b=%d",*a,*b);
}
main()
{int x=20,y=30;
clrscr();
printf("(1)x=%d y=%d",x,y);
swap(&x,&y);
printf("(4)x=%d y=%d",x,y);
} 展开
!
void swap(int *a,int *b)
{int t;
printf("(2)*a=%d *b=%d",*a,*b);
t=*a;*a=*b;*b=t;
printf("(3)*a=%d *b=%d",*a,*b);
}
main()
{int x=20,y=30;
clrscr();
printf("(1)x=%d y=%d",x,y);
swap(&x,&y);
printf("(4)x=%d y=%d",x,y);
} 展开
推荐于2017-11-23 · 知道合伙人互联网行家
关注
展开全部
形参其实是在把实参传递给子函数的时候定义了一个新的变量,但是这个变量的值和实参相等
所以在子函数里 无论怎么修改都不会影响到调用它的函数的实参的值
在用指针做参数的时候 因为传递的不是值本身,而是它所对应的地址,我们改变值的时候是改变那个地址里的值 所以 传递指针的话 就能改变值了
如果你希望在子函数里可以修改调用它的函数的值的话你可以使用引用函数
就比如
#include<stdio.h>
void fun(int &x)
x = x + 1;
void main()
{
int a = 5;
fun(a);
printf("%d",a);
}
就是在参数前加了一个&就行了
所以在子函数里 无论怎么修改都不会影响到调用它的函数的实参的值
在用指针做参数的时候 因为传递的不是值本身,而是它所对应的地址,我们改变值的时候是改变那个地址里的值 所以 传递指针的话 就能改变值了
如果你希望在子函数里可以修改调用它的函数的值的话你可以使用引用函数
就比如
#include<stdio.h>
void fun(int &x)
x = x + 1;
void main()
{
int a = 5;
fun(a);
printf("%d",a);
}
就是在参数前加了一个&就行了
展开全部
楼主你好,要理解这个必须理解一个问题,就是指针的定义。指针自己是有一个存储空间的,里面存的是被指的一个数(如a)的地址。也就是说指针中存的是a的地址。调用函数的时候,通过指针找到a的地址,然后对a的值进行改变,也就改变了a的值。
其二是,我们普通的赋值(主函数中),a=2,其实并不是对a赋值,a只是一个代号,a是指向a所在的地址,a只是一个入口,就是对a所在的地址中的存的数据进行了改变。
如果在讲a作为实参传数据给形参b,这样的话,就是把a地址中的数据传给了b,调用函数中对b的赋值等,仅仅是影响到了b中的值,而没有影响到了a的值。
形象的说吧,指针到最后是一个东西,不管a还是b对这样东西做修改,都会改变。而普通的是两样东西,b做修改的仅仅只是b的东西,跟a的没有关系。
其二是,我们普通的赋值(主函数中),a=2,其实并不是对a赋值,a只是一个代号,a是指向a所在的地址,a只是一个入口,就是对a所在的地址中的存的数据进行了改变。
如果在讲a作为实参传数据给形参b,这样的话,就是把a地址中的数据传给了b,调用函数中对b的赋值等,仅仅是影响到了b中的值,而没有影响到了a的值。
形象的说吧,指针到最后是一个东西,不管a还是b对这样东西做修改,都会改变。而普通的是两样东西,b做修改的仅仅只是b的东西,跟a的没有关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是啊,形参不可能改变实参,可你传递指针,实际上就是相当于把这个参数实际地址给他了,而不是一个拷贝,穿指针和穿实参的意义是一样的,在一些没有指针的语言 用 (ref 参数)来传递实参,实际传的就是指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我谈谈我的看法,请多包涵。
首先搞清内存。内存里面的东西是不变的,假设有两个地址,地址为1的其数值为10,地址为2的其数值为20。而a和b只是从其中取值,并且p1,p2各是其地址,(虽然数值上p1,p2与1和2相等,但其本质并不同,也就是其服务的对象不同。)现在p1,p2变了,也就是a和b取值的位置变了,所以其最后的数值变了,视觉上就形成了a和b实参交换数值的结果。!
这是我的理解,是基于内存的知识理解。
首先搞清内存。内存里面的东西是不变的,假设有两个地址,地址为1的其数值为10,地址为2的其数值为20。而a和b只是从其中取值,并且p1,p2各是其地址,(虽然数值上p1,p2与1和2相等,但其本质并不同,也就是其服务的对象不同。)现在p1,p2变了,也就是a和b取值的位置变了,所以其最后的数值变了,视觉上就形成了a和b实参交换数值的结果。!
这是我的理解,是基于内存的知识理解。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我说一下我的理解,以钥匙和锁为举例
值(锁):
当A门有一把锁A(值),B门复制A门一样的锁,不管以后B门的锁如何改变,都不会影响A门。
指针(指针);
这种情况下,只有一个A门,传送指针就好像复制了A门的钥匙A,我叫做B钥匙。这样我有了A门的钥匙B就可以随意的改变门锁A了(值)。
这是我的理解,欢迎指正。
值(锁):
当A门有一把锁A(值),B门复制A门一样的锁,不管以后B门的锁如何改变,都不会影响A门。
指针(指针);
这种情况下,只有一个A门,传送指针就好像复制了A门的钥匙A,我叫做B钥匙。这样我有了A门的钥匙B就可以随意的改变门锁A了(值)。
这是我的理解,欢迎指正。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询