用指针作为变量什么时候可以改变实参

#include<stdio.h>
void fun1(int *a,int *b);
void fun2(int *a,int *b);
void fun3(int *a,int *b);
int main()
{

    int i=10,j=20,*x=&i,*y=&j;
    //fun1(x,y);printf("%d %d",*x,*y); 输出10 20 
    //fun2(x,y); printf("%d %d",*x,*y);输出10 10
    fun3(x,y);     printf("%d %d",*x,*y); //输出20 10 


   return 0;
}
void fun1(int *a,int *b)
{
    int *temp;
    temp=a;
    a=b;
    b=temp;

}
void fun2(int *a,int *b)
{
    int *temp;
    *temp=*a;
    *a=*b;
    *b=*temp;

}
void fun3(int *a,int *b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;

}

/*
(1) 对与第一个fun1()函数

       为什么他们的值没有发生改变呢? 我的理解是,fun()函数中
       是a,b的地址调换了 应该是改变了值才对 应该是20 10,但是
       他们没有改变。

(2)对与第二个fun2()函数

   *temp,*a,*b他们是指针变量所指向的值发生变化,应该不会影响实参i,j吧
   但是和我想的不一样。

(3)对与第三个fun3()函数

   为什么就改变了呢?

*/
阅读 2.7k
2 个回答

指针本质上是一个代表地址的整数,用于寻址,强制类型转换确实可以赋值给整型。
但是并不是所谓的地址调换,所以是你对指针的理解错误了。
你这样在整型和指针之间乱转类型,尤其直接把拿 int 的值去寻址,八成都改了不知道哪里的内存了。

吐槽下你的编译器:
1.一个 (int 型的 a) 居然可以被赋值给一个 (指针 temp) 而不用显示强制类型转换。
2.居然可以把一个(int 型的 a)直接 *a 就当作指针用。

严格的说法,在c中你无法改变实参,因为c中传递参数是通过复制来传递的,由main函数到被调函数的过程中实参和行参已经完全没有了关系,除了值相同之外

之前就回答过你了,fun1中的行参a 以及 bmain 中的 x 以及 y 除了指向相同的地址之外
没有任何的关系,你对调了a b不会对xy产生任何影响,也不会对 ij 产生影响

而你所理解的能改变实参,指的是通过指针可以改变指向变量的值(毕竟指针就是干这个的!),无论指针(被调函数(fun1 fun2 fun3)中的 a b 以及 main中的x y )在哪里,只要指向的地方相同都能访问到那个指向的变量(i 以及 j),即通过 *a 或者 *x 就能改变 i的值!

fun2 是错误的写法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进