c语言问题请教老师们
“调用函数时可以把实参数组元素中的值一一对应给形参数组的元素中”为什么是错的?请解释一下
这里不是对应,在这里不是一一对应,是直接传递的是地址,是地址传递,而“调用函数时可以把实参数组元素中的值一一对应给形参数组的元素中”说法反映的是值传递,关于值传递与地址传递的区别如下: C语言地址传递和值传递简析 [原创] hewei 2003-08-04 -------------------------------------------------------------------------------- --------------------------------------------------------------------- 文档简介: 本文写作初衷是为了解决C语言初学者关于地址传递和值传递一直理解得不 太好的问题。
也是对这部分课程内容的一个总结。 文档作者: 和薇 论坛用户:hewei 北京工业大学实验学院 理工学科部 计算机基础,C语言,C++语言,数据结构教师 --------------------------------------------------------------------- 不少同学在学到C语言的指针部分时感到很困惑,对经常提到的“值传递”和“地址传递”两个概念弄不明白。
实际上,因为地址本身也可以作为一个特殊的“值”,所以地址传递也是一种特殊的值传递。只是为了强调其特殊性,故称之为“地址传递”。我们在学习过程中可以视参数的形式而区别对待,比如若参数传递的是简单数据类型的数值,则将其归类为值传递方式;若参数传递的是变量的地址,则视其为地址传递方式。
值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 下面我们用书上出现频率最高的一个程序来分别实现值传递过程和地址传递过程。 void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("\n(swap):%d,%d\n",x,y); } void main() { int a,b; scanf("%d,%d",&a,&b); if(a 假设我们从键盘输入两个数据:5,9,先来看一下运行结果: (swap):9,5 (main):5,9 按照值传递的特点,我们可以很清楚的看到,虽然在swap函数中暂时使得运行结果显示了交换后的数据,即达到了交换的目的,但实际情况却是随着swap函数的结束,被作为局部参数的形参x,y以及swap函数本身的局部参数temp都将结束其生存期,在内存中的存储空间被释放。
因此实参a,b的并未受到影响,依然保持原值。 从这道程序中我们也可以学到一个方法,比如有时不需要修改实参,但是又需要被调函数所作的工作能够得以体现,就可以灵活的在被调函数中使用打印语句。因此上面的程序可以改写为: void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("\n从大到小排列的顺序为:%d,%d\n",x,y); } main() { int a,b; scanf("%d,%d",&a,&b); if(a 再来看地址传递方式: void swap(int *p,int *q) { int temp; temp=*p; *p=*q; *q=temp; } void main() { int a,b; int *pointer_1=&a,*pointer_2=&b; scanf("%d,%d",&a,&b); if(a 但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。 这一部分内容对初学者来说理解起来有一定的难度,所以在学习过程中一定要多想多练多思考,希望以上的讲解能对初学者有所帮助。 。
答:黑水珠的说法是对的,不过后面两位给出的代码却有点问题,下面是我给出的代码: main() { FILE *fp; int num; char ch[500]; ...详情>>
答:我建议你去--天下网吧联盟 这里面都是网吧业主和网管交流的论坛,你可以自己注册一个用户进去看看,你可以和他们交流也可以寻求他们的帮助,我想没有你解决不了的问题,...详情>>
答:格式化文本区域的段落标记,用于规定文本和层的属性和位置等。比如: 新浪网 用来规定 新浪网 这三个字居中显示。 文本中心(CENTER)、左(LEFT)或右(R...详情>>