c语言单项值传递比较,求大神,在线等!

作者&投稿:愈怕 (若有异议请与网页底部的电邮联系)
c语言,关于形参实参单向值传递!~

分两种情况给你对比一下
函数形参用普通变量,当函数被调用的时候,实参的值被赋值给了形参,函数被调用的时候开辟了内存空间给形参,也就是数据被复制了,然后函数开始处理形参的数据,这个时候和实参的数据是没有任何关系了。当函数结束的时候形参的内存空间是要被释放,或者说删除的,所以对实参啥也没干,只是拿了实参的数据复制了一份,然后对复制的那一份算的很起劲,结果最后删除了,啥也没干。
函数形参用指针,当函数被调用的时候,实参指针,也就是把地址复制了一份给形参,但是函数中我们用取内容符号'*'对形参指针所指的内容,同时也是实参指针所指的同一份内容进行处理,函数结束的时候形参指针的值是被释放了,可是形参指针,同时也是实参指针所指的内容还在。
感觉讲的蛮清楚了,不懂再追问。

#include #define LEN 10000int factorsSum(int n) { /*求真因数之和*/int i, sum=0; for(i=1; i<n; i++) if(n%i == 0) sum += i; return sum;}int main (void) { int numberFactorsSum[LEN], i, j; for(i=1; i<LEN; i++) /*求 1-(LEN-1) 之间每个数的真因数之和*/ numberFactorsSum[i] = factorsSum(i); for(i=1; i<LEN; i++) for(j=i+1; j<LEN; j++) /*判断 i 和 j 是否为相亲数数*/ if(numberFactorsSum[i] == j && numberFactorsSum[j] == i) printf("%d %d
", i, j); return 0;}运行结果

给你几条C语言中的现实说法:
一、参数传递实际上全是传值,地址也是数值
二、究竟传递的是地址还是数值,可以从函数调用那里的实参类型情况为区分
如:
int i=3,j=5,*p=&i,*q=&j,*r;
r=f(p,q); //p q 是指针变量,这说明传递到子函数f()中的是地址,当然函数声明int *f(int *s,int *t) 也明确指出了 形参s t都是int类型指针,实参类型要与形参相匹配才是正确的调用!

r=f(i,j); //这样写就是错误的,因为i j是数值,不是地址
r=f(&i, &j); //这样写是正确的,与r=f(p,q); 是相同的,传递的分别是i j的地址,&符号是取地址操作符。
三、如何在子函数中区分代码是不是改变了实参的值呢?
如果传递的参数是数值,如有如下函数:f1(int i, int,j); 这样,无论在子函数中的形参(i,j)如何变化都不会改变实参的数据。
如果传递的参数是地址,如你的例子int *f(int *s,int *t),如果变化的是 s t本身,而不是通过*s *t进行操作,则不会改变实参。 *符号表示引用地址中的数据,这样的代码是指对地址中的数据进行操作,会改变实参对应的数据。
四、关于你的代码的区别
int *f(int *s,int *t)
{
int k; //这里定义一个整型变量,用来做下面的数据交换的临时变量,是正确的用法!
if(*s<*t) {k=*s ; *s=*t; *t=k;} //这里是将s地址中的数据与t地址中的数据进行了交换(区别)
return s;

}

int *f(int *s,int *t)
{
int *k; //这里定义的是一个指针变量,而下面的代码用它来存储s地址中的整数,用错误的用法!
//但,因为地址也是整数,所以k作为指针变量,也可以存储整数,所以,你的代码也能正确运行出结果
if(*s<*t) {k=*s ; *s=*t; *t=k;}
return s;

}
而你所谈的第三种情况:
int *f(int *s,int *t)
{
int *k; //这里定义的是一个指针变量,作为中间变量,存储地址交换的临时变量
if(*s<*t) {k=s ; s=t; t=k;} //这里交换的是两个指针的位置,但原地址中存放的数据没有改变,s指向了地址中数据较大的一个。即:实参数据没有变化,只是通过这里实现了指针指向的变化(区别)
return s; //这时返回指向较大的一个数据的地址,也能得到你想要的结果

}

综上,可以看出,两个代码的区别在于,是否对指针(地址)中的数据进行了改变!

前一个是传址的(双向传递),后一个存在错误,如果将if(*s<*t) {k=*s ; *s=*t; *t=k;}改为if(*s<*t) {k=s ; s=t; t=k;} 则是传值的(单向传递)。


c语言swap指针
include<stdio.h>void swap(int x,int* y){int t; t=x;x=*y;*y=t;}int main(){int a=5,b=10;swap(a,&b);printf("%d,%d\\n",a,b);return 0;} swap函数第一个是值传递,第二个传递的是指针,值传递为单项传递,相当于运行swap时,又创建了一个内存存放a的数值,但是指针传递...

C语言中(a>b)?a:b和(a
C语言中,“(a>b)?a:b”和“(ab)?a:b 就是将a和b二者中较大的一个赋给max。2、min=(a

C语言规定,调用一个函数时,实参变量和形参变量之间的数据传递方式是什么...
函数只有两种传递方式:1、值传递,又称单向传递,只能把实参数值传给形参 ,形参最后的结果不影响实参(形参改变大小 ,实参大小不变)。2、址传递,通过指针,把实参的地址给形参,形参的大小可以影响实参。

值传递和引用传递的区别是什么
值传递和引用传递的区别在于参数值的和内存地址的不同。编程中,参数传递可以使用两种方式:值传递和引用传递。它们之间的主要区别在于传递的是参数的值还是内存地址。值传递是指将参数的值复制到函数的形参中,这样在函数内部对形参的修改不会影响到原始参数。这意味着,如果在函数内部对形参进行更改,原始...

c语言值传递与地址传递问题
值传递:不管怎么传,原来的实参的值都不会改变。地址传递,原来的实参的值可能被改变。打个比方:值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。include<stdio.h> point(char *pt)main(){char b[4]={'m','...

C语言的传值和传址的区别
区别:对形参的影响不同 1、在传值中函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。2、传址中压栈的是指针变量的副本,当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。

C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是
答案是B,单向的值传递 简单变量做实参时,相应的形参变量也是简单变量,它们之间的数据传递方式是单向的值传递,即数据只能由实参传到形参,形参值的改变不影响实参值的变化。

C语言中参数传递有什么特点
C语言中参数传递 分类及特点:1、值传递: 在函数调用时,发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。2、地址传递:可以实现地址互换。3、引用传递:与地址传递一样,可以实现地址互换,但该传递仅适用于C++语言。

C语言,函数参数传递方式是单向的,形参不能给实参赋值是什么意思? 自定 ...
实参把值传给形参以后就和形参切断联系了,对形参操作后得到的是副本。c语言是严谨的,一个地址对应唯一的参数,但同一个参数可能有不同的地址 拿经典的swap交换函数举例 如果你交换的不是指定地址的变量 只是普通变量 那么他给你返回的结果就是你给的变量的副本的交换 而当交换对象变成指定地址的对象...

c语言中表达式1和表达式2有什么区别?
它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。C语言传递参数均是以值传递(...

蠡县13235606569: c语言单项值传递比较,求大神,在线等! -
时震艾尔: 给你几条C语言中的现实说法:一、参数传递实际上全是传值,地址也是数值 二、究竟传递的是地址还是数值,可以从函数调用那里的实参类型情况为区分 如:int i=3,j=5,*p=&i,*q=&j,*r; r=f(p,q); //p q 是指针变量,这说明传递到子函数f()中的...

蠡县13235606569: 用c语言编写,输入5个整数,输出最大值和最小值,要用值传递的方法, -
时震艾尔: 值传递就是在调用函数中使用的参数不是实际的参数,而是拷贝过去的,即使调用函数中参数改变,实际参数也不跟着变,代码如下:#include void compare(int b[5]); void main() { int i; int a[5]; printf("请输入五个数:\n"); for(i=0;i scanf("%...

蠡县13235606569: c语言程序,求参数传递,在线等 -
时震艾尔: 1.参数传递 如果只是要读到数组里面的值,可以这样定义一个函数void ReadArray ( int a[ ]/*数组名*/ , int length/*数组长度*/) ; 如果要更改数组内的值,就要这样定义 void UpdateArray( int (*a)[N] , int length ); 举例说明如下:#include <...

蠡县13235606569: C语言中的值传递和址传递. -
时震艾尔: 都是值传递,真正的引用传递是出现在C#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝,但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部的那个指针的值(注意,修改的不是地址值)*p = 30; 那么主函数内的值也变成了30,因为是对同一个地址存放的数据进行了操作

蠡县13235606569: C语言地址传递和值传递的问题 -
时震艾尔: 我把自己的理解给你,可能和书上写的不一样,不过绝对是正确的 地址传递和值传递不能简单理解为传递的是地址还是值,而是函数结束后对实际参数是否有影响,比如将实参的地址传递给形参,那么只有形参使用*p的形式才能调用实参,否则都是形参之间的运算,和实参没有半点关系.举个例子 int a,b,*p,*q,*s; p=&a; q=&b; s=a; a=b; b=c; p ,q的值不变,s,a,b只是进行了值传递,只不过没有放到函数里

蠡县13235606569: 求C语言大神详解程序 -
时震艾尔: 注意f的参数类型,此时是值传递,所以c的内容没变,故选A.如果f的参数类型改为STU *a,调用时改为f(&c),则是非值传递.

蠡县13235606569: C语言关于函数 值传递,地址传递..求大侠通俗解答~! -
时震艾尔: 第一个swap2(a[0],a[1]);传的是a[0],a[1]的实际值,而不是地址,而数组里的值不会改变

蠡县13235606569: C语言编制函数!!!求大神指点.... -
时震艾尔: #include<stdio.h>#define Maxsize 10 void Find(int a[],int *m,int *n) { int i; for(i=0;i<Maxsize;i++) { if(a[*m]<a[i])*m=i; if(a[*n]>a[i])*n=i; } } int main() { int a[Maxsize],maxid=0,minid=0; printf("请为数组赋值:\n"); for(int i=0;i<Maxsize;i++)//输入10...

蠡县13235606569: C语言里用指针比较两个字符串,自编strcmy函数.求大神帮忙看下我写的程序,顺便帮我改下 -
时震艾尔: #include<stdio.h>//int strcmy(int *p1,int *p2); int strcmy(char *p1,char *p2) { int n=0; char *p3,*p4; p3=p1; p4=p2; // char a[20],b[20]; //*p1=a[20];//*p2=b[20];for(;*p1!='\0'&&*p2!='\0';p1++,p2++){ if(*p1==*p2) n=0; if(*p1>*p2){ printf("%s",p3); n=1;...

蠡县13235606569: c语言中,2== 3的值为多少? 求大神 -
时震艾尔: ==是逻辑比较,两数相等,返回真(1),否则返回假(0) 因此,2==3值为0

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网