外贸网

  • 首页
  • C语言调用函数互换ab,为什么要用指针。不用指针能行吗?注意,是调用函数。 C语言 写一个函数交换两个数的值,为什么一定要用指针?

    作者:媒体   更新日期:2024.05.19
    这是 C 语言 本身 特性 规定了 的。你只要记住 这点: 形参 必须用指针,这样才能把 通过 函数加工 后的 数值 带回来。通过函数 互换后 的a,b,才能被带回。
    至于“为什么”,可以不去追究,它的理由 无非 是什么 地址啦,值啦之类,时间长了,自己会记混淆。
    其它语言,例如 fortran 语言,不管形参是什么花样,都能带回。

    C语言 写一个函数交换两个数的值,为什么一定要用指针?

    运用代码解释指针运用的理解如下:
    #include
    using namespace std;
    int fun1 (int a,int b)
    {
    int c;
    c=a;a=b;b=c;
    cout<<"a1:"<<a<<";b1:"<<b<<endl;
    }
    int fun2 (int *a,int *b)
    {
    int *c;
    c=a;a=b;b=c;
    cout<<"a2:"<<*a<<";b2:"<<*b<<endl;
    }
    int fun3(int *a,int *b)
    {
    int *c;
    c=*a;*a=*b;*b=c;
    cout<<"a3:"<<*a<<";b3:"<<*b<<endl;
    }
    int fun4 (int *a,int *b)
    {
    int c;
    c=*a;*a=*b;*b=c;
    cout<<"a4:"<<*a<<";b4:"<<*b<<endl;
    }
    int fun5 (int &a,int &b)
    {
    int c;
    c=a;a=b;b=c;
    cout<<"a5:"<<a<<";b5:"<<b<<endl;
    }
    int main()
    {
    int aa=1,bb=2;
    fun1(aa,bb);
    cout<<"aa1:"<<aa<<";bb1:"<<bb<<endl;
    fun2(&aa,&bb);
    cout<<"aa2:"<<aa<<";bb2:"<<bb<<endl;
    fun3(&aa,&bb);
    cout<<"aa3:"<<aa<<";bb3:"<<bb<<endl;
    fun4(&aa,&bb);
    cout<<"aa4:"<<aa<<";bb4:"<<bb<<endl;
    aa=1,bb=2;
    fun5(aa,bb);
    cout<<"aa5:"<<aa<<";bb5:"<<bb<<endl;
    return 0;
    }
    输出结果为:
    a1:2;b1:1
    aa1:1;bb1:2
    a2:2;b2:1
    aa2:1;bb2:2
    aa3:1;bb3:2
    a4:2;b4:1
    aa4:2;bb4:1
    a5:2;b5:1
    aa5:2;bb5:1
    main中调用fun1()时,将实参a,b的值传递给了交换函数,如果此时在swap1中打印,可以看到结果是正确的,但是该过程其实是将aa和bb分别复制了一份给了函数,执行完fun1()之后,aa和bb的值没有任何变化。
    fun2(),看似的确使用了指针,但还是失败,因为这里是将aa和bb的地址给交换了,而并没有交换aa和bb的值。在这里由于未给c赋值,c中并没有确定的值,c中的值是不可预见的。此时c可能指向一个未知的存储单元。
    而严重的情况是,该单元的数据可能是有用的,因此fun2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁。
    fun3(),将int赋值给int *,编译错误。
    fun4()是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化。
    函数调用结束后,哲别变量值的变化依然保留下来,这样就实现了通过函数调用是变量的值发生变化,在其它函数中可以使用这些改变了的值的目的。
    fun5()也是正确的,这是引用的重要应用之一。对于引用的操作实际上是作用在引用所因的对象上。

    扩展资料
    在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。
    所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。

    因为在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。
    所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容。

    解释下为什么C语言中用函数交换两个数的值只能用指针,而不能用这个方法...
    答:因为在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能。所以,在函数中要操...

    c语言 为何这个函数能互换ab的值
    答:这是指针参数的特点,改变的是其指向的地址的值。你就可以相像一下:给了hx(...)一共a, b两个盒子,可以换里面的东西,但无论怎么样,a盒子还是a盒子,b盒子还是b盒子。

    C语言指针使用函数交换两个变量的值
    答:现在回答第二个问题,怎么会让ab的值变化:传入指针,也就是在main函数中使用a b的指针,然后吧指针传入到函数里面 这个时候ab就会真正的发生变化,因为指针指向的是ab的物理地址,也就是真正的ab,不是副本,这个时候就会改变ab的值。想要理解,可以去百度传值参数和引用参数。纯手打,望采纳 ...

    C语言 写一个函数交换两个数的值,为什么一定要用指针?
    答:而严重的情况是,该单元的数据可能是有用的,因此fun2()不但没有实现两个数的交换,反而给系统的稳定性带来威胁。fun3(),将int赋值给int *,编译错误。fun4()是正确的。为了在函数中改变了的变量能被其它函数调用,正确的办法是用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值...

    C语言ab互换
    答:a,b; a=b; a的值改变了,并不影响b的值。第二个传递的是地址,数组名表示的就是数组的首地址,所以形参 char a[] 其实就是 char *a;将实参的地址赋值给 a了,所以形参改变了,实参也改变了。这就相当于 int a;int *p =&a; 如果 *p发生了变化,a的值也跟着发生变化。

    c语言中用于交换值函数问题
    答:而在void gsd(int &a,int &b)中int &类型使a和b的性质发生了变量,它们是“引用变量”,调用时它们就成了实参的“别名”——就是说在函数中操作的是实参本身,所以结果实参发生了交换变化——int &等类型是C++引入的新类型,C是没有的。要搞清楚的是int &是“整型引用”,并不是指针;整型...

    C语言中调用函数交换两个变量的值需要传递地址,为什么相加就可以直 ...
    答:举个栗子:有100个房间,从0到99编号,每个房间放在不同的食材。交换两个变量的值 只需要告诉你把A房间和B房间的东西调换,你不需要知道房间里面放的是什么。只需要知道AB的房间号;加法:如果问你A房间和B房间里的食材可以做什么菜,你就需要知道AB房间分别放了什么。不需要知道房间号。

    C语言,流程图当a
    答:如果a<b,那么ab互换,也是就是确保a是大的,第二步,如果如果a<c,也就是c最大,输出顺序是c b a ,否则就判断b c 的关系。。。例如 输入的是 a=5 b=10 c=8 1、a>b?表达式 是N ==》a b 互换 a=10 b=5 2、a<c?N 3、b<c?Y 输出 a c b 月就是 10 8 5 ...

    c语言中,为了交换a和b的值,用传值调用的方式为什么不能交换,而通过传地...
    答:这个你学了C++就会彻底明白,值传参重点是值,他实际上是在函数内部创建了一个临时变量保存你传入的值,你修改的只是那个临时变量.而地址传递同样有临时变量不过这个临时变量存的是地址,你在使用指针交换值时,它实际是通过地址找到你真实的变量进行修改....

    c语言 函数调用 swap函数 一定要用指针吗
    答:没有传回给你原来所要交换的数。而printf放里面可以是因为你的那份拷贝(即a,b)的值是跟你要交换的数一样的,所以行得通。不用指针的方法就是:void swap(int &a,int &b){ int t;t=a;a=b;b=t;}这样就可以了,这个传进去的是原先数据的地址,地址都改变了,值也就交换了。