关于形参和实参,改变实参问题

形参的改变无法影响到实参,是我开始以为的。后来发现用指针变量可以改变实参。

#include <stdio.h>
#include<stdlib.h>

void fun(int *a,int *b)
{
  int *c;
  c=a;
  a=b;
  b=c;
}

void fun1(int *a,int *b)
{
     int *c;
     *c=*a;
     *a=*b;
     *b=*c;
}

int main()
{
  int  x=3, y=5, *p=&x, *q=&y,*k=&x,*z=&y;
  fun(p,q);  printf("%d,%d\n",*p,*q);
  fun1(k,z);printf("%d,%d\n",*k,*z);
  // fun(&x,&y); printf("%d,%d\n",*p,*q);
  return 0;
}

这段代码 输出 3,5 3,3;

首先我认为,在main()中,p,q获得了整形x,y的地址。进入fun()函数后,a,b,c交换的a,b的地址应该p,q的地址也要变化,因此我错误的认为输出5,3

至于进入fun1()函数后,是指针变量的值互换应该不会改变我错误的认为应该输出3,5.请您帮我指导下,详细点。否则我可能不懂。谢谢您

阅读 3.2k
2 个回答

func 由于是形参,虽然a跟b的数值调换了(a,b是int *类型也就是你说的地址(地址也是值)),但是不是引用传递,所以对p,q没有任何影响。

func1 你的int *c都没初始化就赋值*c=*a;确定能跑通?

void fun1(int *a,int *b)
{
     int *c = new int;
     *c=*a;
     *a=*b;
     *b=*c;
}

func1 更改的是*a 和 *b的数值(*a指的是取a地址的内容,也就是说把a地址的内容和b地址的内容交换了,内存层面的操作全局都是有效的),所以最后输出结果5,3

你的输出结果3,3是怎么打印的?主要你的程序没初始化指针肯定抛异常啊

举个例子内存里有4个值,A1->B1,A2->B2,A3->B3,A4->B4其中A是地址B是值,B1=A3,B2=A4也就是说A1和A2存的是A3,A4的指针,A1,A2,A3,A4分别对应你程序的p, q, x, y变量

进入func,p传递给a,A5->B1, q传递给b,A6->B2
func就是在函数局部交换了a,b的值对应我的例子就是A5->B2,A6->B1交互B1和B2的值,但是func函数退出局部变量销毁A5,A6,剩下A1->B1,A2->B2,A3->B3,A4->B4

进入func,p传递给a,A5->B1, q传递给b,A6->B2
交换a,b的内容(*a 就是取a地址的内容对应例子A5->B1=A3->B3取出来的是B3), 交换后A5->B1=A3->B4, A6->B2=A4->B3,直接看A3和A4内存结构变为A3->B4和A4->B3
退出局部变量销毁A5,A6,剩下A1->B1,A2->B2,A3->B4,A4->B3

int main()
{
  int  x=3, y=5, *p=&x, *q=&y,*k=&x,*z=&y;
  fun(p,q); 
      | |
      | |________copy q to b____
      |                         |
      |____copy p to a___       |
                         |      |
           void fun(int *a,int *b)
            {
              int *c;
              c=a;
              a=b;
              b=c; // actually a and b has no relation to p and q
            }
 fun1(k,z);
      | |
      | |________copy z to b____
      |                         |
      |____copy k to a___       |
                         |      |
            void fun1(int *a,int *b)
            {
                 int *c;
                 *c=*a;
                 *a=*b;
                 *b=*c; // a and b same as fun
                        // but *a is reference x, *b is reference y
                        // swap *a and *b also affected x and y
            }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题