资源描述
C语言实参、形参、函数调用、指针、引用、*&符号实例
实现环境:VC6
程序源代码:
#include "stdio.h"
#include <malloc.h>
void fun1(int a) //传值调用
{
printf(" 形参a为:%d\n",a);
a--;
printf(" 形参a变为:%d\n",a);
}
void fun2(int *b) //指针调用
{
printf(" 指针形参b为:%X\n", b);
printf(" 指针形参b所指内容为:%d\n", *b);
(*b)--;
printf(" 指针形参b所指内容变为:%d\n", *b);
}
void fun3(int &c) //数值的引用调用,相当于给数值实参n起个新名字叫c,然后c就是实参n
{
printf(" 引用数值形参c的地址为:%X\n",&c);
printf(" 引用数值形参c为:%d\n", c);
c--;
printf(" 引用数值形参c变为:%d\n", c);
}
void fun4(int * &d) //指针的引用调用,相当于给指针实参m起个新名字叫d,然后d就是实参m
{
printf(" 引用指针参数d为:%X\n", d);
printf(" 引用指针参数d所指内容为:%d\n", *d);
(*d)--;
printf(" 引用指针参数d所指内容变为:%d\n", *d);
}
void main()
{
int n=11; //有11个苹果
printf("实参n为:%d\n",n);
fun1(n); //传值调用
printf("数值n为:%d\n\n",n);
printf("实参n的地址为:%X\n",&n);
printf("数值n为:%d\n",n);
fun2(&n); //指针调用
printf("实参n的地址为:%X\n",&n);
printf("数值n为:%d\n\n",n);
printf("实参n的地址为:%X\n",&n);
printf("数值n为:%d\n",n);
fun3(n); //数值的引用调用
printf("实参n的地址为:%X\n",&n);
printf("数值n为:%d\n\n",n);
int * m;
m=&n;
printf("数值n的地址为:%X\n",&n);
printf("数值n为:%d\n",n);
printf("指针m为:%X\n",m);
fun4(m); //指针的引用调用
printf("数值n的地址为:%X\n",&n);
printf("数值n为:%d\n",n);
printf("指针m为:%X\n\n",m);
}
参考内容:
VC++中形参什么时候需要加&符号
引用不是必须的,因为用指针可以达到相同的效果
当你传递的实参值需要在函数中获取改变的时候,就需要传引用或者指针
假设有 n = 10 个苹果
void fun(int m) //传值函数,每调用一次减少一个苹果
fun(n);//如果按上面的声明 ,这样调用完后,n还是10,并没有变成9
在这种时候就需要用到引用或者指针
void fun(int &m) ; //引用类型函数声明 ,对应调用fun(n); //
void fun(int *m); //指针类型函数声明 ,对应调用fun(&n); //
具体的函数体可以自己去写
事实上,引用的本质就是指针,使用引用能完成的事情,使用指针同样能完成 ,不过引用看上去更简洁和直观
引用参数
在形参表中以符号“&”开始的参数即为引用参数。
如果一个形参是引用参数,调用部位将把实参的地址传递给子程序。
于是子程序操作的就是实参真正的变量,而不是它的副本。
如果程序员想修改指针本身,而不是指针引用的对象:
那么他可以声明一个参数,该参数是一个指针的引用,例如:下面是交 换两个指针的函数。
1
2
3
4
5
void ptrswap( int * & v1, int * & v2 ) {
int *tmp = v2;
v2 = v1;
v1 = tmp;
}
如下声明
int * &v1; //实际是为指针取了一个别名,这样就可以通过别名改变指针本身
应该从右向左读,v1 是一个引用,它引用一个指针,指针指向 int 型的对象。
用函数 main() 操纵函数 rswap() 我们可以如下修改代码以便交换两个指针值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
void ptrswap( int *&v1, int *&v2 );
int main() {
int i = 10;
int j = 20;
int *pi = &i;
int *pj = &j;
cout << "Before ptrswap():\tpi: "
<< *pi << "\tpj: " << *pj << endl;
//参数为指针的别名(即指针的引用,那么传递的实参就是指针本身,道理和传递普通变量一样的)
ptrswap( pi, pj );
cout << "After ptrswap():\tpi: "
<< *pi << "\tpj: " << *pj << endl;
return 0;
}
编译并运行程序 产生下列输出
Before ptrswap(): pi: 10 pj: 20
After ptrswap(): pi: 20 pj: 10
参考:
C++ 引用参数 深入分析
比如函数 void a(int &x,int &y)
当调用该函数时,如:a(m,n);
就相当于在执行函数体时,x为m的引用,y为n的引用
x,y相当于指向m,n的指针
相当于给m,n起的别名,这时在函数体内对x,y进行的操作实际上就是对m,n进行操作。
%d %o %x %X
分别是 十进制,八进制,十六进制(小写),十六进制(大些)的输出格式!
展开阅读全文