函数调用时形参和实参实参是地址值,形参不是指针变量而是数组,这样的话一个是地址一个是元素,进行值传递怎样理解

扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
一些C预言自测题2,第11题 用数组名作为函数调用时的实参,则实际传递给形参的是( ).A、数组的第一个元素值 B、数组中全部元素值 C、数组的首地址 D、数组的元素个数 第12题 判断字符串的长度,应该使用的函数是( ).A、strcat B、strcmp C、strcpy D、strlen 第13题 从变量的作用域来分,可分为全局变量和局部变量,形参是( ).A、局部变量 B、全局变量 C、静态变量 D、动态变量 第14题 当对两个字符串进行比较时,应该使用的函数是( ).A、strcat B、strcmp C、strcpy D、strlen 第15题 已知 int i=1;执行语句while(i++
好114****44580
扫二维码下载作业帮
2亿+学生的选择
第11题 用数组名作为函数调用时的实参,则实际传递给形参的是( ).A、数组的第一个元素值 B、数组中全部元素值 C、数组的首地址 D、数组的元素个数 【我的回答】Cfun(int[] arr); 传递的是arr[0]的地址,选C-------------------------------------------第12题 判断字符串的长度,应该使用的函数是( ).A、strcat B、strcmp C、strcpy D、strlen 【我的回答】D查cstring标准库,选D------------------------------------------- 第13题 从变量的作用域来分,可分为全局变量和局部变量,形参是( ).A、局部变量 B、全局变量 C、静态变量 D、动态变量 【我的回答】A你就想,你自己干了坏事,不可能枪毙全班,只可能是对应着“局部”的你,所以选A,哈哈(开玩笑哈)------------------------------------------- 第14题 当对两个字符串进行比较时,应该使用的函数是( ).A、strcat B、strcmp C、strcpy D、strlen 【我的回答】B查cstring标准库,选B------------------------------------------- 第15题 已知 int i=1;执行语句while(i++
为您推荐:
其他类似问题
扫描下载二维码问题: 形参为指针数组,为何实参指针数组被改变
描述:形参实参指针指向指针的指针C语言指针数组
众所周知,形参为指针变量因为值传递的关系,形参改变是无法改变实参的。但是最近看到了形参为指针数组的函数竟然改变了实参是为什么?
void&sort(char*name[],int&n)
for(int&i=0;i&n-1;i++)
for(int&j=i+1;j&n;j++)
if(strcmp(name[i],name[j])&0)
temp=name[i];
name[i]=name[j];
}这是那个函数,用来进行排序字符串,n代表实参中字符串的个数,详见谭浩强C语言程序设计&指针数组与多重指针一节的例题。解决方案1:
传一个数组名进来,改变数组的内容正常,只不过这里传的是指针数组,所以可以改变。
解决方案2:
在这个例子中,你说传的是形参是指针数组,而不是指针所指向的变量。
我们所说的是形参的改变不影响实参,那么,如果你对该函数中的形参也就是指针进行修改,是不会影响到外面的实参指针。但是本例中,所修改的内容时指针所指向的内容!解决方案3:
这个并没有不是形参改变了实参,描述本身就有问题。形参就是一个变量,实参将值传递给形参,形参接收,这个动作并没有改变实参。而是函数里的逻辑改变了实参的值(地址值),所以描述还是要准确一些。
参数(形参)分为传入参数和传出参数。这个函数的形参,即作为该函数的传入参数,也做为这个函数的传出参数,即将实参的值带给函数,并修改实参的值,并将实参修改后的值反给调用函数,即传出参数。
解决方案4:
http://edu.csdn.net/course/detail/2344&C语言指针与汇编内存地址-一.代码要素解决方案5:
传址和传值,&&楼主没有搞清楚.
如果你懂点汇编,&就知道,&所谓的值传递和地址传递,&其实都是在函数开始的地方,&把参数"值"&push到堆栈中了.
而这个值,&可能是一个真数值,也可能是一个地址.&&如果是地址,&那么这个地址你在函数内部把可重新指向,&但不影响外部,&相当于值传递,&但如果你通过这个地址,&修改了地址对应位置内存的值,&那么这个地址对应的内存中的数据就会真正改变了.
void&swap(int&*val1,&int&*val2)
&&&&//交换指针指向的内存中的值
&&&&&int&temp&=&*val2;
&&&&&*val2&=&*val1;
&&&&&*val1&=&
&&&&//交换指针变量
&&&&int&*pT&=&val1;
&&&&val1&=&val2;
&&&&val2&=&pT;
void&main()
&&&&int&val1&=&10;
&&&&int&val2&=&20;
&&&&int&&*p1&=&&val1;
&&&&int&*p2&=&&val2;
&&&printf("val1=%d&&val2=%d&&p1=%p&&&p2=%p\n",val1,val2,&p1,p2);
&&&&swap(p1,p2);
&&&&printf("val1=%d&&val2=%d&&p1=%p&&&p2=%p\n",val1,val2,&p1,p2);
&&&&//交换后,&你会发现,&val1,和val2的值交换了,&p1和p2是没有变的.
原因在上面已经说了.
对于p1,p2指针变量本身来说,&他们是值传递的,&&只是对于val1和val2来说,&是传递的他们的地址.所以函数内部可以通过地址来修改它们的值.
解决方案6:
首先你要搞清楚到底传的什么参数。
指针传值时,参数是指针,而不是指针指向的量,此时在函数内对指针本身进行修改,是不会影响到外面的实参指针,但是如果函数内是对指针指向的量的修改,因为形参指针和实参指针都指向同一个量,自然会影响到该量的值。
char*&name[]作为参数时,相当于二级指针&char&**name,name是传值,对name的修改不会影响到外面的数组,但对name[i]以及*(name+i)的修改,就会影响到外面的数组。
以上介绍了“ 形参为指针数组,为何实参指针数组被改变”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/4452788.html
上一篇: 下一篇:c++将数组名作为函数参数对数组元素进行相应的运算
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了c++将数组名作为函数参数对数组元素进行相应的运算,需要的朋友可以参考下
用数组名做函数参数与用数组元素作实参有几点不同:
(1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。用数组名作函数参数时,则要求形参和相应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参两者类型不一致时,将会发生错误。
(2)用普通变量或下标变量作函数参数时,形参变量和实参变量都是由编译系统分配的两个不同的内存单元。在函数调用时进行的值传递是把实参变量的值赋予形参变量。在用数组名做函数参数时,不是进行值的传递,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。因为数组名就是数组的首地址。因此用数组名做函数参数时所进行的传递实际上是地址的传递,也就是把实参数组的首地址赋予形参数组名。形参数组名取得该首地址后,也就等于有了具体的地址。实际上是形参数组和实参数组为同一数组,共同使用一段内存空间。
代码如下://例:一维数组score,存放10个学生的成绩,求平均值。
#include&stdio.h&#include&string.h&#include&conio.h&#include&stdlib.h&float average(float array[10]){&&&&& float aver,sum=array[0];&&& for(i=1; i&10; i++)&&&&&&& sum=sum+array[i];&&& aver=sum/10;&&&}void main(){&& float score[10],&&&&&& printf("input 10 score:\n");&&& for(i=0; i&10; i++)&&&&&&& scanf("%f",&score[i]);&&& printf("\n");&&& aver=average(score);&&& printf("average score is %5.2f\n",aver);}
(1)用数组名作函数参数,应该在主调函数和被调函数中分别定义数组。(2)实参数组与形参数组类型应一致,如不一致,结果将出错。(3)实际上,指定被调函数中形参数组的大小是不起任何作用的,因为C编译器对形参数组大小不做检查,只是将形参数组的首地址传给形参数组。(4)形参数组也可以不指定大小,定义数组时在数组名后跟一个空的中括号,为了在被调函数中处理数组元素的需要,可以另设一个参数,传递数组元素的个数。
代码如下:#include&stdio.h&#include&string.h&#include&conio.h&#include&stdlib.h&float average(float array[],int n){&&&&& float aver,sum=array[0];&&& for(i=1; i&n; i++)&&&&&&& sum=sum+array[i];&&& aver=sum/n;&&&}void main(){&& float score1[5]= {98.5,97,91.5,60,55};&&& float score2[10]= {67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};&&& printf("the average of class A is %6.2f\n",average(score1,5));&&& printf("the average of class B is %6.2f\n",average(score2,10));}
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具数组作为函数参数
本文所属图书&>&
本书全面详细地讲述了单片机的原理、编程指南及应用案例,其中51系列单片机的编程部分是本书的重点。全书分为5篇共38章。首先介绍51系列单片机的开发概述及单片机的基本结构,接着介绍单片机的汇编程序设计语言,...&&
数组可以作为函数的参数使用,进行数据传送。在C51语言中,数组作为函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。下面分别进行讲解。
1.数组元素作为函数实参
数组元素作为函数实参是指在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。其中数组元素就是下标变量,与普通变量是完全相同的。下面举例讲解数组元素作为函数实参在程序设计中的应用。这里自定义一个函数fun,用于判别一个整数数组中各元素的值,若是奇数,则输出该值,否则不输出。程序代码示例如下:
#include &stdio.h&&&&&&&&&&&&&&&&&&&&&&&&&& //头文件
void fun(int a)&&&&&&&&&&&&&&&&&&&&&&&&&&&& //定义函数
if(a%2==1)&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& //判断是否为奇数
&&& printf(&%d\n&,a);&&&&&&&&&&&&&&&&&&&&&&&&&& //如果是,则输出
void main()&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& //主函数
int num[5]={1,2,3,4,5};&&&&&&&&&&&&&&&&&&&& //定义并初始化数组
for(i=0;i&5;i++)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //循环调用函数
&&& fun(num[i]);
该程序可以在Keil &Vision3编译环境中执行,运行的结果如下:
在本程序中,首先定义一个无返回值函数fun,并说明其形参a为整型变量。在函数体中,根据a值输出相应的结果。在main函数中,首先初始化一个整型数组,然后用一个for语句循环fun函数,即把数组元素num[i]的值传送给形参a,供fun函数使用。
2.数组名作为函数参数
数组名作为函数参数是指在发生函数调用时,把作为实参的数组名传送给形参,实现单向的值传送。
在普通变量或数组元素作为函数参数时,形参变量和实参变量是由编译分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量;而在用数组名作为函数参数时,不是把实参数组的每一个元素的值都赋予形参数组的各个元素,只是将实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
下面举例讲解数组名作为函数参数的应用,定义一个数组a中存放了一个学生5门课程的成绩,求平均成绩。程序示例如下:
#include &stdio.h&&&&&&&&&&&&&&&&&& &&& &&& //头文件
int sum(int num[5])&&&&&&&&&&&&&&&&&&&& &&& //定义函数,用于求和
int sum=0;
for(i=0;i&5;i++)
&&& sum=sum+num[i];
void main()&&&&&&&&&&&&&&&&&&&& &&&&&&& &&& //主函数
int num[5]={1,2,3,4,5};&&&&&&&&&&&& &&& &&& //定义并初始化数组
sum1=sum(num);&&&&&&&&&&&&&&&&&&&&& &&&&&&& //调用函数
printf(&the sum of num is %d\n&,sum1);&&&&& &&& //输出结果
该程序可以在Keil &Vision3编译环境中执行,运行的结果如下:
the sum of num is 15
本例中,首先定义了一个整型函数sum,有一个形参为整型数组num,长度为5。在函数sum中,把各元素值相加求和,并将结果返回给主函数。主函数中首先初始化一个数组num用于存放一个学生5门课程的成绩,然后以num作为实参调用sum函数,函数返回值保存在sum1中,最后输出sum1值。
注意:用数组元素作为实参时,只要数组类型和函数的形参变量的类型一致,并不要求函数的形参也是下标变量;而用数组名作为函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,就会发生错误。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
文章下载读书

我要回帖

更多关于 c语言函数形参和实参 的文章

 

随机推荐