C语言中,函数参数只能传值。与传值对应的是传引用,C语言不支持函数参数传引用,C++语言才支持。
创新互联建站服务项目包括月湖网站建设、月湖网站制作、月湖网页制作以及月湖网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,月湖网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到月湖省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
C++传引用函数:
void foo(int a) { a = 3; }
假如a = 2,执行foo(a)后,a = 3。
---
C语言可以模拟传引用,方法是通过指针来实现:
void foo2(int* ap) { *ap = 3; }
假如a = 2,执行foo2(a)后,a = 3
foo2(a)调用本质上仍然是传值,只不过传递的是指针,指针即是地址,地址本质上是一个无符号整数。
如果:
void foo3(int b) { b = 3; }
假如a = 2,执行foo3(a)后,a = 2。这是因为foo3(a)调用过程中,a值传给形参b,修改b的值与实参a无关。
注意到,foo3(a)与上述foo(a)传引用的调用是形式一样的。
既然C语言通过指针可以实现传引用调用,为什么C++还要引入引用这个特性呢?这是因为C++引入的很多新特性需借助引用来实现,比如,拷贝构造函数等等。
确实很急,函数声明 中的函数名都打错了~~返回值也没打。
函数传递是值传递,传递指针的值 能改变 调用函数的值是因为 他们的地址是 一样的。而实质上也是值传递,进来的是指针指向的地址。
而你mop函数交换的是 指针 也就是 地址 值 当然不影响调用函数。
主函数中
p=m;m=n;n=p;
交换是因为这几个指针一直在作用域中,没有释放。交换了指针中存放的地址,就是指向的内存地址的改变。运行下下面二的程序 能帮你理解。
#includestdio.h
int main()
{
int a=604,b=750,c;
int *m,*n,*p;
m=a;
n=b;
printf("指针没有交换前的地址m n %d %d\n",m,n);
p=m;m=n;n=p;
printf("指针交换后的地址m n %d %d\n",m,n);
printf("%d%d\n",*m,*n);
printf("值没有交换前的地址m n %d %d\n",m,n);
c=*m;*m=*n;*n=c;
printf("值交换后的地址m n %d %d\n",m,n);
printf("%d%d\n",*m,*n);
return 0;
}
===========================
#includestdio.h
int main()
{
void nop(int *x,int *y);
void mop(int *x,int *y);
int a=604,b=750;
int *m,*n;
m=a;
n=b;
printf("主函数中指针交换前的地址\tm n %d %d\n",m,n);
mop(m,n);
printf("主函数中指针交换后的地址\tm n %d %d\n",m,n);
printf("%d%d\n",*m,*n);
nop(m,n);
printf("%d%d\n",*m,*n);
return 0;
}
void mop(int *x,int *y)
{
printf("指针没有交换前的地址\t\tm n %d %d\n",x,y);
int *z;
{z=x;x=y;y=z;}
printf("指针交换后的地址\t\tm n %d %d\n",x,y);
}
void nop(int *x,int *y)
{int a;
a=*x;*x=*y;*y=a;
}
首先需要声明函数指针的类型(下例子中的typedef int (*fpFunt)(int a,int b),再定义某个函数(下例中的Add),在其参数列表中使用该函数指针类型,同时需要定义另一函数(下例中的fpAdd,注意该函数形式要和fpFunt一致,本例子中是返回一个整数,两个整型参数)作为实参用。这里在手机上使用易历知食软件内的微C程序设计来编程,举个两个数相加的例子,代码如下图:
调用后运行结果如下图: