C语言传地址调用

Python012

C语言传地址调用,第1张

1、值传递:不管怎么传,原来的实参的值都不会改变。

地址传递,原来的实参的值可能被改变。

打个比方:

值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。

地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。

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的值。