C语言调用函数互换ab,为什么要用指针。不用指针能行吗?注意,是调用函数。

作者&投稿:包萍 (若有异议请与网页底部的电邮联系)
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,才能被带回。
至于“为什么”,可以不去追究,它的理由 无非 是什么 地址啦,值啦之类,时间长了,自己会记混淆。
其它语言,例如 fortran 语言,不管形参是什么花样,都能带回。


C语言中,是否可以调用其它文件的函数?
在A2.c中:有函数void A2(){...};。在A1.c中:在文件前头增加一行:void A2();就可以了。2、把A2.c中完整定义的函数的原型,写到一个A2.h文件中,然后在A1.c的文件头增加#include "A2.h"就可以了。以上两种方法,在A1.c中都可以正常的调用,就跟在A2.c中调用一样。其实函数默认是...

C语言函数里的参数是指针的问题
函数定义和函数调用是两个概念,函数定义 为f(int *arr),表示参数是一个整型指针,因此使用该函数时要传递一个地址,如变量int a=0; 调用函数f传递a的地址时需要写为f(&a);而对于数组来说,如int b[]=[1,2,3], b本身就是数组首元素的地址,因此调用函数f传递数组首地址需要写为f(b)。

c语言fun函数的功能是交换形参的值,不能交换实参的值,都是按值传递为什...
void fun(int *a, int *b){ int *c; c=a;a=b;b=c;}因为函数中,形参a,b中保存的都是实参的地址值,c=a;a=b;b=c;这行代码,只是把形参a,b的地址值进行了互换,对调用函数的实参所保存的结果是没有任何影响的。如果换成如下代码:void fun(int *a, int *b){ int c;...

请问两个被调用函数a和b之间是否也可以互相调用,即a调用b,b调用a?
可以的呀,但是C语言中需要声明一下即可!void A();void B(); void A(){B();} void B(){A();}

用C语言如何使用函数调用来做一维数组排序?谢谢了
\/\/ 按增量序列dlta[0..t-1]对顺序表L作希尔排序 int dlta[6] = {50,25,12,6,3,1};for (int k = 0; k < 6; ++k)ShellInsert(L, dlta[k]);} \/\/ ShellSort Partition(int L[], int low, int high) { \/\/ 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,...

c语言 调用函数里面的max=a[i]是地址赋值还是字符串赋值?
max=a[i]或max=a[0]都是错误的写法 max是指针,a[i]或a[0]都是字符,所以是误将字符当做指针赋给了指针变量。应该改为*max=a[i]和*max=a[0],这是把字符值赋给max指针指向的字符变量

C语言函数调用中怎么判断是地址传递还是值传递
根据参数类型以及函数实现的功能综合判断。注意不能单单看是否为指针。要传递类型为A的值,如果参数类型是A*,那么为传地址,反之,如果参数类型是A,那么是传值。比如,要传递int型参数:1 传值:void func(int a);2 传地址:void func(int *a);而传递char *型参数。1 传值:void func(char ...

C语言中主函数中调用了两个函数,这两个函数的形参能不能用同样的字母...
形参不能用相同的字母,否则无法区分是哪个变量了,而且形参名称相同,也编译不过的。

关于c语言 在c中调用函数时,只能把实参的值传递给形参,形参的值不能...
不对,在C语言中,传值有地址传值和参数传值,参数传值只能将实参传值给形参,所以A选项正确。C语言中的外部变量是可以在函数之间传递数据的。C语言中的自动变量是默认的变量,实际上是函数中的局部变量,所以D选项正确。全局变量一经定义都是需要分配内存单元,在程序运行过程中自始至终都会占用固定的...

C语言用函数调用求a的阶乘
include <stdio.h>int fun(int a){int s=1;for(int i=1;i<=a;i++)s*=i;return s;}int main(int argc, char *argv[]){int a,s=0;scanf("%d",&a);printf("a!=%d\\n",fun(a));return 0;}

高要市17717879951: C语言 写一个函数交换两个数的值,为什么一定要用指针? -
丁是消炎: 运用代码解释指针运用的理解如下: #include<iostream> 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...

高要市17717879951: c语言中,为了交换a和b的值,用传值调用的方式为什么不能交换,而通过传地址调用却可以成功交换 -
丁是消炎: 因为swap函数的两个形参是指针类型啊,要求你传a和b的地址进去才行如果你传a和b的值进去,它会把a和b的值当做地址往里面取值,这里面的值压根就是不是a和b的值,已经无法预测了,当然达不到交换a和b的值的作用

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

高要市17717879951: 解释下为什么C语言中用函数交换两个数的值只能用指针,而不能用这个方法..还有如果用全局变量该怎么写 -
丁是消炎: 因为在函数中的参数,并不是调用者的变量,而是临时申请的变量a和b存放main函数中变量a和b的值,并在函数中用来计算,在fun中给a和b赋值都是在操作这两个临时申请的变量,函数返回后,这两个变量被舍弃,函数调用也没有将这两个临时变量的值返回给main函数中调用使用的参数功能.所以,在函数中要操作调用者申请的变量,需要给出它们的指针,函数中用指针来找到这些变量的位置和内容.

高要市17717879951: C语言中 为什么不能用函数互换两个值~ -
丁是消炎: C语言中函数的参数有两种传递形式1 传值调用2 传值调用 传值调用只把变量的值传递给函数,函数自己开辟一段内存储存变量的值(这就是所谓“形参”--形式参数),而对形参的一切修改都不会影响变量本身的值(变量本身就是“实参”--实际参数). 传值调用是将实参的内存地址传递到函数中(以指针的方式调用),这样就可以在函数中修改变量的值(如交换两个变量的值) 本题中的函数应写成:void huhuan(int &c,int &d) { int t; t = (*c); (*c) = (*d); (*d) = t; return; }

高要市17717879951: C语言指针使用函数交换两个变量的值 -
丁是消炎: 这个地方会出现不好理解的东西. 调用函数的时候,你放入了int a int b 但是这其实不是你的main函数中的a b只是相当于他们的副本,也就是复制了一个a 和b 传入函数 所以你改变的只是传入的副本 也就是复制的副本a b所以在main函数中打印的ab不会出现变化 依然是a=3,b=6 现在回答第二个问题,怎么会让ab的值变化:传入指针,也就是在main函数中使用a b的指针,然后吧指针传入到函数里面 这个时候ab就会真正的发生变化,因为指针指向的是ab的物理地址,也就是真正的ab,不是副本,这个时候就会改变ab的值.想要理解,可以去百度传值参数和引用参数.纯手打,望采纳

高要市17717879951: 定义两个变量ab如何用c语言编程使两个变量的值能相互交换 -
丁是消炎: 1、 首先,就是最基本的知识,写头文件,函数声明,定义变量. 2、下面还需要定义指针,需要定义两个指针p1和p2,然后把a的地址赋值给p1,把b的地址赋值给p2. 3、然后就是调用函数,该函数没有返回值,就直接调用,但是参数进入的是a和b的地址,而不是a和b. 4、 函数用完之后,就是输出a和b的值看一看是否进行了互换. 5、a和b的地址传给x和y,我们通过指针直接对a和b的值进行操作. 6、 最后就是调换*x和*y的值,这样就是实现了a和b的值.

高要市17717879951: C语言中调用函数时A(&B)中的&是什么意思 -
丁是消炎: 函数中的&有两种情况,一种为获取该变量的内存地址,赋给指针,进行相关操作 另外一种最常见的是指传入参数为引用,相对于非引用参数,引用的参数在该函数中不会产生临时变量,而是直接将自身作为参数传递至该函数,因此在该函数内部的值修改后,在函数外仍然有效

高要市17717879951: c语言中函数A调用函数B,B又可以调用A? -
丁是消炎: 可以,刚刚你问了递归,a调用b,b用调用a也是递归,这种叫间接递归哈

高要市17717879951: C语言的指针在函数里面把变量a和b的值交换后为什么能传回main函数? -
丁是消炎: 打个比方,假设 a 的地址为 2000,b 的地址为 2100..然后将 2000 和 2100 作为参数传入函数.. 星号是取值符号..*p1,也就是地址为 2000 的内存所存储的值.. temp=*p1;*p1=*p2;*p2=temp; 这个交换,就是把地址为 2000 和 2100 的内存所存储的值进行交换.. 这样一来,a 和 b 的值也就交换过来了..没错..其实 *p1 的地址就是 a 的地址..只是表达方式不同..对 *p1 进行操作,就相当于对变量 a 进行操作..不管在函数体内,还是函数体外..

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网