本文目录一览:
关于c语言形参实参传地址传数值的问题
C语言中函数的参数传递(值传递,地址传递,引用传递)
/* ^_^ 2015年11月3日09:58:03 辨析 C语言中函数的参数传递*/
//值传递 其实质是将数值传递给其他俩个变量,自己变量里面的值并没有改变----所以说是值传递。
# include stdio.h
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(x,y); //这就是典型的值传递,它把X,Y的值传递给变a和b;
printf("%d %d\n",x,y); //a,b的值进行交换,但是变量X,Y里面的值并没有交换。
return 0;
}
void exchange(int a,int b)
{
int temp;
temp =a;
a=b;
b=temp;
printf("%d %d\n",a,b);
}
//地址传递 (提到地址二字,应该始终明确,C语言中的地址是基于指针的,所以地址传递是一定会用指针的)
# include stdio.h
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(x,y); //这就是典型的地址传递,它把X,Y变量地址传递给指针a和b;
printf("%d %d\n",x,y); //*a,*b的值进行交换,就是找到a,b对应的地址交换地址里面的值,其实也就是
//找到 a,b值进行交换。
return 0;
}
void exchange(int *a,int*b)
{
int temp;
temp =*a;
*a=*b;
*b=temp;
printf("%d %d\n",*a,*b);
}
c语言传值和传地址
输出:
调用函数前输出结果:
nums[1]=0
nums[2]=0
nums[3]=0
nums[4]=0
value = 0
因为循环变量初值是1,所以nums[0]不会输出
findMax(nums,value); //调用findMax,vals指向nums开始元素,m=0
i=1;[i=1],iMAXELS成立,开始循环,vals[i]=1,nums[0,1,0,0,0],输出:vals[1]=1
i++;[i=2],iMAXELS成立,继续循环,vals[i]=1,nums[0,1,1,0,0],输出:vals[2]=1
i++;[i=3],i5成立,继续循环,vals[i]=1,nums[0,1,1,1,0],输出:vals[3]=1
i++;[i=4],i5成立,继续循环,vals[i]=1,nums[0,1,1,1,1],输出:vals[4]=1
i++;[i=5],i5不成立,结束循环,输出:m=1
函数返回,m被舍弃,输出:
调用函数后输出结果:
nums[1]=1
nums[2]=1
nums[3]=1
nums[4]=1
value = 0
由于子程序中没有计算过m,所以m值一直是初始的1,这个m是函数自己临时定义的变量,用来接收调用者传进来的参数,main函数将vale的值0传递给m,计算完后,函数返回,m被舍弃,不会影响value的值(作为参数,是取value的值来用一下,然后就没有value的事了)
如果想将m的值返回,那么有两种办法:
函数写成:void findMax(int vals[],int *m),然后函数中用到m的地方都改成*m,调用时findMax(nums,value);
函数写成:int findMax(int vals[],int m),函数最后写return m;调用时value=findMax(nums,value);
如果子程序不需要value作为m的初始值,则可省略第2个参数:int findMax(int vals[]),调用:value=findMax(nums);
c语言 传值和传地址
c语言中数组的实质就是指针,所以函数的参数是数组的话,就是传入了一个指针,也就是传入了一个地址。
主函数向findMax中传了两个参数,vals是传地址,m是传值,所以在findMax函数中,对vals做的改变可以带回到主函数,而对m的赋值却对主函数中的变量value没有任何影响
关于c语言的传值和传地址
编程中,很多东西要你自己去摸索,才能真正的理解。关于地址与值的问题,其实你自己可以试,把变量的地址输出来看看看是不是一样,比如 printf("%x",a); 这样就是以把变量a的地址用16进制的方式输出来,看看地址到底是怎么一回事。
传值与传地址可以这样理解:
就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了,现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递。
同理,如果我把我的作文直接给你,你看了后也把有些地方改了,现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了,这就是传地址,即引用传递。
这只是我的理解,有误的地方还请指正。
C语言数组的地址传递和值传递
1.值传递就不写了,顾名思义就是把当前的值传到下一个函数中,变量本身的没有发生任何变化
2.指针传递,把当前变量指针传到下一个函数,在另外函数里边修改指针的值会修改当前变量值
#include stdio.h
void func(int *p){
*p = 9;
return;
}
void swap(int *a, int *b){ //交换两个变量的值
int temp = *a;
*a = *b;
*b = temp;
}
int main(void){
int a = 0;
func(a); //要修改一个变量,把他的地址传过去
printf("%d",a);//9
int b = 3;int c = 4;
swap(b,c);
return 0;
}
C语言传值传址的问题
首先是C语言的参数传递机制,比如下面这样的一个简单函数
int plus(int a,int b){
return a+b;
}
//..
//其它函数中调用
z=plus(x,y);
这个函数调用的过程中会进行参数拷贝,也就是说上述代码会被编译成大致如下的样子(以下为伪代码)
int plus{
int a;int b;//函数的参数也是函数的内部变量
return a+b;
}
//...
//其它函数中调用
plus:a=x;//先将参数的值复制给被调用函数内部的参数
plus:b=y;//同上
z=plus()//执行函数
注意到上述过程中,所有函数的参数都是“复制”进去的,也就是说函数内部看见的参数并不是外部传入的参数本身,而是其副本,对副本进行操作(如交换)会失败,因为这些操作无法影响到外部的参数本身。
但如果使用指针传参,例如
void fun(int*a,int*b)//顺带一提,返回值一定要养成习惯写上
{int c;c=*a,*a=*b,*b=c}
//...
fun(x,y)
在编译的时候同样遵循参数复制原则,变成如下代码(以下为伪代码)
fun
{
int* a;int* b;//参数a,b仍然是函数的内部变量,不过其类型是int*
int c;c=*a,*a=*b,*b=c
}
//...
fun:a=x;//将x的地址复制给a
fun:b=y;//同上
fun();.//执行函数
可以看到,参数仍然是“复制”进去的,但要注意,传入的参数x与其参数副本a虽然是两个东西,但他们是指针,存储的地址一样,也就是指向的对象时一样的(都是x),y与b同理,因此在函数内部通过指针a,b寻址就可以访问函数外部的变量x,y,并对其进行交换操作