#include
double power(double x, int n);//先进行声明,在后面实现也可以
int main()
{
printf("2的2次方为:%lf\n",power(3,3));
return 0;
}
double power(double x, int n)//函数具体的实现
{
double product = 1;
int i;
for (i=0; i<n; i++){
product *= x;
}
return product;
}
以上代码格式为 函数先声明,再调用,然后实现 的顺序
函数之间的参数传递方式:
#include
int x = 3, n = 2;//定义全局变量x,n
double power();
int main()
{
printf("%d的%d次方为:%lf\n",x,n,power());//这里无需再传参了
return 0;
}
double power()//这里不要参数也行了
{
double product = 1;
int i;
for (i=0; i<n; i++){ //这里x和n直接使用全局变量
product *= x;
}
return product;
}
#include
double power(double x, int n);
int main()
{
int x = 2;
int n = 2;
printf("2的2次方为:%lf\n",power(x,n)); //把x,n作为实参赋值给形参x,n
return 0;
}
double power(double x, int n)//形参x,n
{
double product = 1;
int i;
for (i=0; i<n; i++){
product *= x;
}
return product;
}
输出结果:
2的2次方为:4.000000
代码2:
#include
void exchange(int a, int b);
int main()
{
int c = 2;
int d = 3;
exchange(c,d);
printf("c = %d, d = %d\n",c,d);//在main函数中打印
return 0;
}
void exchange(int a, int b)
{
int t;
t = a;
a = b;
b = t;
}
输出结果:
c = 2, d = 3
从上面这个结果可以看出实参 c 和 d 并没有发生交换,但是这具体是什么原因呢?
答案是:形参和实参在内存中的存储空间是不一样的,形参是另外开辟的存储空间,当 exchange 函数被调用时,c 的值被复制(赋值,下同)到形参 a 中,同样的,d 的值被复制到形参 b 中,也就是形参 a 和 b 中存的都是实参 c 和 d 的副本,而在 exchange 函数内部只会交换形参 a 和 b 的值,不会影响到实参 c 和 d。
如果想要实质性的交换需用指针,(PS:交换指针的值-地址没有用,除非直接在被调用函数中打印交换地址过后的 *a 和 *b )如果只是想看一下打印结果,可以把输出函数写到被调用函数(交换函数)中去,这里举一个用指针进行实质交换的例子:
#include
void exchange(int * a, int * b);//形参都为指针
int main()
{
int c = 2;
int d = 3;
exchange(&c,&d); //实参为 c 和 d 的地址
printf("c = %d, d = %d\n",c, d); //在这里打印
return 0;
}
void exchange(int * a, int * b)
{
int t;
t = *a;
*a = *b;
*b = t; // * 取传入地址对应的值,然后通过 t 进行交换
}
输出结果:
c = 3, d = 2
在C语言中,参数传递可以通过值传递(复制传递)或引用传递(地址传递)来实现。选择何种方式取决于对函数的需求和要求。
复制传递(值传递):
使用复制传递时,函数接收到的是实际参数的副本,而不是实际参数本身。这意味着在函数内部对形式参数进行的修改不会影响到实际参数的值。
复制传递适用于以下情况:
示例代码中的exchange
函数使用了复制传递,因为我们只是想在函数内部交换参数的值,并不需要修改实际参数的值。
地址传递(引用传递):
使用地址传递时,函数接收到的是实际参数的地址,可以通过指针操作实际参数的值。在函数内部对形式参数的修改会影响到实际参数的值。
地址传递适用于以下情况:
示例代码中的修改后的exchange
函数使用了地址传递,我们通过传递指针来操作实际参数的地址,从而实现变量值的交换。
总而言之,在选择参数传递方式时,需要根据具体的需求和情况来决定。如果需要修改实际参数的值,或者实际参数是大型结构体或数组时,地址传递通常是更好的选择。而对于不需要修改实际参数的值,或者实际参数是基本数据类型或小型结构体时,复制传递是更简单和高效的方式。