地址传递,原来的实参的值可能被改变。
打个比方:
值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。
地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。
2、例如:
#include<stdio.h>
point(char *pt)
main()
{char b[4]={'m','n','o','p'},*pt=b
point(pt)
printf("%c\n",*pt)
}
point(char *p)
{p+=3
*p='F'}//加上这一句就变了
输出:
调用函数前输出结果:
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],i<MAXELS成立,开始循环,vals[i]=1,nums[0,1,0,0,0],输出:vals[1]=1
i++[i=2],i<MAXELS成立,继续循环,vals[i]=1,nums[0,1,1,0,0],输出:vals[2]=1
i++[i=3],i<5成立,继续循环,vals[i]=1,nums[0,1,1,1,0],输出:vals[3]=1
i++[i=4],i<5成立,继续循环,vals[i]=1,nums[0,1,1,1,1],输出:vals[4]=1
i++[i=5],i<5不成立,结束循环,输出: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)
①理论
结构体传值,
形参(值)不改变实参(值),
将结构体变量的值作为实参传递。
结构体传址,
形参(指针)改变实参(地址)所指成员的结构体值,
将结构体变量的地址作为实参传递。
struct A t
A是结构体标识名,t是变量名,
t中包含若干成员。
~
②传值
#include<stdio.h>
#include<string.h>
/*结构体说明*/
struct A
{int a
char b[20]
double c}
/*函数说明*/
void f(struct A t)
/*主函数*/
void main()
{struct A a={1111,"Zenglaoshi",1111.0}
f(a)
printf("%d,%s,%6.1f\n",a.a,a.b,a.c)}
/*定义函数*/
void f(struct A t)
{t.a=2222
strcpy(t.b,"Zhangyida")
t.c=2222.0}
结果
是a,1111,"Zenglaoshi",1111.0
不是t,2222,"Zhangyida",2222.0
只是生成参数a的一个副本,
不会改变a的值。
~
③传址
#include<stdio.h>
#include<string.h>
/*结构体说明*/
struct A
{int a
char b[20]
double c}
/*函数说明*/
void f(struct A *p)
/*主函数*/
void main()
{struct A a={1111,"Zenglaoshi",1111.0}
f(&a)
printf("%d,%s,%6.1f\n",a.a,a.b,a.c)}
/*定义函数*/
void f(struct A *p)
{p->a=2222
strcpy(p->b,"Zhangyida")
p->c=2222.0}
结果
是*p,2222,"Zhangyida",2222.0
不是a,1111,"Zenglaoshi",1111.0
改变a的值。