这两个有什么区别
#include<stdio.h>int *f(int *s,int *t)
{
int *k;if(*s<*t){
k=s;s=t;t=k;
}
return s;
}
int main()
{
int i=3,j=5,*p=&i,*q=&j,*r;
r=f(p,q);
printf("%d,%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
return 0;
}输出的结果是 3,5,3,5,3,5
但是。。。。。
#include<stdio.h>
int *f(int *s,int *t)
{
int *k;if(*s<*t){
k=*s;*s=*t;*t=k;
}
return s;
}
int main()
{
int i=3,j=5,*p=&i,*q=&j,*r;
r=f(p,q);
printf("%d,%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
return 0;
}这个的输出结果是5,3,5,3,5,3
求各位大佬能用通俗易懂的知识讲解一下这是为什么?感谢大佬
第一个相当于:
k=&i;s=&j;t=&i
值不变
第二个相当于:
2.k=i i=j j=k
但是!这个是有问题的,你强制地指定了一个地址给k。 无符号整形 发表于 2018-8-7 10:05
第一个相当于:
值不变
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?
llovenova 发表于 2018-8-7 10:09
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?
不是 是因为k是一个局部变量,然后你既没有写他,也没有读它,就不会出现访问错误。
你只是把它赋值了而已,然后输出了它的地址 llovenova 发表于 2018-8-7 10:09
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?
2楼正解,但楼主您明不明白??
您对函数的理解还不够清晰。如果是传值给函数,那么对函数而言,接收到的是一份副本。运算完后,把结果返回,所以对您手头上正本的资料是没有作用的。因此,您执行对调之后,却没有真正的对调。这是实参与形参的不同之处。
先不要管局部变量,或者最好不要管局部还是全局变量。就连 main() 里面的都是局部变量!吸收不了就先不要管~
如果是传址(指针),那是直接作用在正本上的。内存中的地址是独一无二的不能拷贝呀。
代码一:
(k = s) >> k == &i ; (s=t) >> &i == &j ; (t = k) >> &j == k == &i
输出结果应该是3, 5, 3, 5, 5
您的 printf 多了一个 %d
您这个是互换地址。资料在内存中的地址被对调了,但相对应的资料还是一样的
代码二:
k = i , i = j , j = k == i
这个操作才是把值给对调
@无符号整形<< 好像弹不了
第二个没问题吧。只要没有访问 k 就可以了
页:
[1]