1.3 练习: 画内存分析图

练习: 画内存分析图,求出以下程序的结果。

int my_fun(int z)
{
	z = z/5;
	return z;
}

int fun(int x,int y)
{
	int c;
	c = x + y;
	my_fun(c);
	return c;
}

int main(int argc,char *argv[])
{
	int a = 10,b = 5;
	int ret = fun(a,b);
	
	ret = my_fun(ret);
	printf("ret = %d\n",ret); //3
	return 0;
}

1、形参和实参

一、形参出现在函数定义中,在整个函数体内都可以使用,形参变量只有在被调用时才分配内存单元,在调用结束时即刻释放所分配的内存单元,因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 离开该函数则不能使用,实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

二、形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

三、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。

四、实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。

五、实参和形参的数据传递方式有两种,

1)一种是值传递,实参和形参都不是指针,这种情况下函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 在函数调用过程中,形参的值发生改变,而实参中的值不会变化。究其原因,是因为这两个参数在内存中位于不同的位置,值传递只是形参将实参的内容复制,在内存中被分配了新的内存单元,在函数执行完毕以后地址会立刻被释放掉,因此形参的改变不会对实参有任何影响。 2)另一种是地址传递,就是实参与形参共用同一个内存单元,在函数执行的过程中,实际就是对实参的地址进行操作,因此形参改变,实参同步变化,实际他们就是同一变量,因为在内存中占据的就是一个内存单元

进行分析

首先,这个函数并不存在地址传递,所以不需要考虑这个问题。下面这幅图是变量在内存中的存储方式:
1.3 练习: 画内存分析图_第1张图片

首先进入main函数:

【注】:int a;的含义是:在内存空间内申请了一段连续的四个字节的内存空间,并且通过a来访问该地址空间。
首先此时定义了两个int型的变量,意义如下
1.3 练习: 画内存分析图_第2张图片
然后执行int ret = fun(a,b);
1.3 练习: 画内存分析图_第3张图片
此时调用了函数fun();通过前面的概念可得,此时我们需要给形参申请地址空间:
1.3 练习: 画内存分析图_第4张图片
此时fun()函数中又调用了my_fun();函数:

1.3 练习: 画内存分析图_第5张图片
此时my_fun();函数结束:
将z所指向的那块地址空间释放:
1.3 练习: 画内存分析图_第6张图片
接着结束fun()函数:
1.3 练习: 画内存分析图_第7张图片
然后此时结束main()函数
1.3 练习: 画内存分析图_第8张图片
此处还没写完。。。待续

你可能感兴趣的:(C语言)