鍍金池/ 問答/C  C++/ 關(guān)于形參和實(shí)參,改變實(shí)參問題

關(guān)于形參和實(shí)參,改變實(shí)參問題

形參的改變無法影響到實(shí)參,是我開始以為的。后來發(fā)現(xiàn)用指針變量可以改變實(shí)參。

#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;

首先我認(rèn)為,在main()中,p,q獲得了整形x,y的地址。進(jìn)入fun()函數(shù)后,a,b,c交換的a,b的地址應(yīng)該p,q的地址也要變化,因此我錯(cuò)誤的認(rèn)為輸出5,3

至于進(jìn)入fun1()函數(shù)后,是指針變量的值互換應(yīng)該不會(huì)改變我錯(cuò)誤的認(rèn)為應(yīng)該輸出3,5.請(qǐng)您幫我指導(dǎo)下,詳細(xì)點(diǎn)。否則我可能不懂。謝謝您

回答
編輯回答
挽歌

func 由于是形參,雖然a跟b的數(shù)值調(diào)換了(a,b是int *類型也就是你說的地址(地址也是值)),但是不是引用傳遞,所以對(duì)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的數(shù)值(*a指的是取a地址的內(nèi)容,也就是說把a(bǔ)地址的內(nèi)容和b地址的內(nèi)容交換了,內(nèi)存層面的操作全局都是有效的),所以最后輸出結(jié)果5,3

你的輸出結(jié)果3,3是怎么打印的?主要你的程序沒初始化指針肯定拋異常啊

舉個(gè)例子內(nèi)存里有4個(gè)值,A1->B1,A2->B2,A3->B3,A4->B4其中A是地址B是值,B1=A3,B2=A4也就是說A1和A2存的是A3,A4的指針,A1,A2,A3,A4分別對(duì)應(yīng)你程序的p, q, x, y變量

進(jìn)入func,p傳遞給a,A5->B1, q傳遞給b,A6->B2
func就是在函數(shù)局部交換了a,b的值對(duì)應(yīng)我的例子就是A5->B2,A6->B1交互B1和B2的值,但是func函數(shù)退出局部變量銷毀A5,A6,剩下A1->B1,A2->B2,A3->B3,A4->B4

進(jìn)入func,p傳遞給a,A5->B1, q傳遞給b,A6->B2
交換a,b的內(nèi)容(*a 就是取a地址的內(nèi)容對(duì)應(yīng)例子A5->B1=A3->B3取出來的是B3), 交換后A5->B1=A3->B4, A6->B2=A4->B3,直接看A3和A4內(nèi)存結(jié)構(gòu)變?yōu)锳3->B4和A4->B3
退出局部變量銷毀A5,A6,剩下A1->B1,A2->B2,A3->B4,A4->B3

2017年10月2日 03:04
編輯回答
糖豆豆
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
            }
2017年3月3日 19:09