您的位置:首页 > 编程语言 > C语言/C++

C语言 变量作为函数定义中的实参写法

2015-06-06 22:53 344 查看
2015 0606

        一直在用数组作为实参,因为在函数定义中,数组名等同于数组第一个数据的地址,所以用作实参的时候很方便(因此,想要通过函数改变数组中的数据是比较方便的)。但是今天编程的时候遇到的问题就是,一旦变量不是全局变量,它在各种函数内使用和修改受到很大局限,所以查找了一下变量作为函数定义里实参的用法。

百度里的错误例子:

#include <stdio.h>

int show1(int number);

int show2(int number1);

int main(void)
{
int number = 10;
int number1=3;
show1(number);
show2(number1);
return 0;
}
int show1(int number)
{
printf("\n show1 *pnumber is : %d,and pnumber's address is :%p\n",number,&number);
return 0;
}
int show2(int number1)
{
printf("\n show2 *pnumber is : %d,and pnumber's address is :%p\n",number1,&number1);
return 0;
}

关于上述程序,百度里别的人回答:

(1)这是因为C语言的函数参数传递是按值传递的,不是按地址传递,参数从实参传递给形参时是拷贝一份然后传递,不影响原来参数的值。并且下次再传递时还是占用这一块临时区。所以地址是一样的。

(2)这个就是C语言的所谓“值传递”
1)虽然你传递的参数不同,num1,num2;但是C编译出来不会把num1/2本身地址传递进去,只是把值传递进去
2)把值传递进去就意味着不使用原来的&num1,&num2两个内存单元来储存这个值,所以系统要提供其它的内存单元来存储和传递这个值。
3)具体使用什么样的内存单元来来储存和传递这个值则是C语言相关也是体系相关。X86使用stack来传参数,ARM/MIPS则使用寄存器来传参数。
4)在X86的体系内,会分配一个4字节的stack地址来存储你的参数,所以打印出来的是该stack单元地址
5)你的两个函数调用都是一个入参数,也就是进入时分配一个stack,退出时释放该stack,所以打印出来的stack地址总是一样的
6)你可以尝试改成shownum1传入2个入参(num1,num2),然后里面在嵌套调用shownum2也是两个入参(num1,num2),打印出来的地址绝对是不一样的。因为show1的stack还没有释放,机械调用show2,它就不能重复利用show1的stack地址了。

接着是百度里正确的程序:

对于以上程序网友的评论:

(1)

我执行了你的程序,结果是:



show1函数执行的时候,number放在地址0012FF2B里,但是执行完后这个地址系统就回收了,不再保存number。

到show2函数执行的时候,恰好系统也给number1分配了这个地址0012FF2B,这个时候地址0012FF2B放的是number1.

所以这里没有存在冲突的地方。

总结来说,变量作为形参的时候有一个非常重要的概念,就是上面多次提到的“值传递”的概念。形参在函数执行的过程中是被系统分配了一个临时地址,而这个地址在函数执行结束后会被释放。也就是说,变量作为形参用于计算的过程中,数据并没有对变量本身进行改变,因为计算过程并不作用在变量的地址。(说的有点混乱,总之就是变量地址中的数据没有被改变,所以变量本身没有改变)

于是,要讲变量作为实参,我们需要直接对变量地址中的数据进行操作。

我在程序中关于这部分是这么写的:

 int Stage_Num=0;

 int Stage[MaxSize];

 int start,end;

 int Length;

void FindMost(int *,int,int *,int *,int *);//函数声明


FindMost(Stage,Stage_Num,&start,&end,&Length);//函数引用,这里就是上述提到的,定义过程中名称和引用时名称不同,不要混淆


void FindMost(int Stage_A[],int Stage_A_Num,int *Average_start,int *Average_end,int *StageMaxLength)//函数定义

{

 if(Stage_A_Num==0) {*Average_start=0;*Average_end=MaxSize-1;*StageMaxLength=MaxSize;}

}

以上只有Stage_Num作为形参,函数没有改变它的值。其他都是实参,函数的操作直接对应于其地址,因此数组和变量都会改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: