重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先,是实参调用形参.你说的地址传递其实和值传递差不多.比如max( a, b );这是实参int max( int *p, int *p2 )这是形参.比如实参,a和b都是取a和b的地址,又因为max()函数的形参是*p和*p2( *p和*p2被声明为整型的指针 ),因为指针是存地址的,所以把a和b的地址赋给p和p2.下面是一个把a和b的值交换的程序./* ============================ 程序名:max.c 目的:用地址交换两个变量的值. ============================ */#include int max( int *p, int *p2 ); /* 声明函数 */ int main( void ){int a, b;scanf( "%d", a ); /* 输入两个变量的值 */ scanf( "%d", b );printf( "a = %d, b = %d\n", a, b );return 0;}int max( int *p, int *p2 ){int temp; /* 定义一个临时变量,为的只是交换 */temp = *p;*p = *p2;*p2 = temp; /* 己交换 */}
成都创新互联主营恒山网站建设的网络公司,主营网站建设方案,手机APP定制开发,恒山h5小程序制作搭建,恒山网站营销推广欢迎恒山等地区企业咨询
C语言中,所有的变量都存储在内存中,可以通过运算符获得变量的内存地址,函数调用时,只需要把普通变量前加上符号,就可以达到传递变量地址的目的。
例如:
定义一个结构体类型
struct Yearmonthday
{
int year, month, day;
};
定义相关函数,参数类型指定为结构体类型指针
void input(struct Yearmonthday *p1) //函数形参p1是结构体指针类型
{
printf("请输入年,月,日:");
scanf("%d,%d,%d",p1-year,p1-month,p1-day);
}
在主函数中定义一个结构体变量,调用相关函数,传递变量地址
int main()
{
struct Yearmonthday ymd;
input(ymd); //传递变量地址,以便带回数据
printf("date=%d/%d/%d\n", ymd.year, ymd.month, ymd.day ); //输出结果
return 0;
}
就是找到这个变量的内存地址,直接读写
例如:scanf("%d",a);
就是找到a的地址,把读入一个数写到a
的地址中
在例如
p=a;
就是让指针p指向a的内存地址,这样直接对内存读写.有利于提高操作速度.
c 语言函数 形参 列表 中 可以是普通变量 或指针变量,不允许 加取址符。
c++ 语言函数 形参 列表 中 加取址符 的参数 叫 “引用”,c 不支持。
------
函数 调用 的实参 类型 要与 形参对应,只有 形参 为 指针变量 的 实参 才可以是 地址。
void f(int x, int *y){};
int a,b;
int *p;
p=a;
调用
可以是 f(b,a);
可以是 f(b,p);
不可以是 f(b,a);
不可以是 f(b,a);
不可以是 f(b,a);
不可以是 f(b,p);
不可以是 f(b,p);
不可以是 f(b,p);
(但愿回答不被封。)
先举个简单例子:
#include iostream
using namespace std;
void Add1(int *a)
{
(*a)++;
}
void Add2(int a)
{
a++;
}
int main()
{
int x=1,y=5;
Add1(x);
Add2(y);
coutx" "yendl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递,
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
还有什么不明白吗
取地址 就是把变量转为指针, 起到传地址调用函数的效果.
而C语言中函数传参有两种,传值调用 和传指针调用.
传值调用时, 被调函数中改变参数值不会影响主函数.
只有传指针调用, 才可以将参数值回传给主函数.
scanf中要根据输入对参数赋值, 所以 必须传指针调用.