成都网站建设设计

将想法与焦点和您一起共享

c语言函数传地址和引用,c语言引用传递和地址传递

C语言传地址调用

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

公司主营业务:网站设计、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出徽县免费做网站回馈大家。

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

打个比方:

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

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

2、例如:

#includestdio.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';}//加上这一句就变了

请问:C++中的引用和C语言中的地址传递有什么区别?

我今天试了一下反汇编的东西,一个是c语言的a+b,两个数字相加的函数,传的是地址,一个是c++的a+b,传的是引用。然后使用vs的反汇编观察,根本没有区别,都是两个地址入栈,然后地址上两个数相加

在c语言编程中,传值方式和传引用方式之间有什么区别?

传值方式:

当一个函数是传值方式的时候,你调用这个函数的时候传入的实参的值会被拷贝到形参,

但是形参与实参之间并没有什么联系,比如变量b=5,a=b;这个时候将b赋值给a,他们的值相等,但是当这以后无论a的值怎么改变都不会影响到b,b=5,a=b;a=1;这时候b依然是5,这就是传值方式

#includestdio.h

void add(int a,int b)

{

a=a+b;//改变了形参a的值

return a;

}

void main()

{

int a=1,b=2;

printf("%d\n",add(a,b));//3

printf("%d\n",a);//1

printf("%d\n",b);//2

}

传引用方式:

当你调用一个函数时,传入的是实参的地址的时候,这时候修改形参,实参也会受到影响,不过这种传地址某种意义是传值,首先将实参的地址拷贝到形参,他们两个以后就没有关系了,你也可以改变形参保存的地址,实参的地址不会改变,但是你操作的是形参对应地址的内容,与实参对应地址的内容一致,操作是同一个对象,所以形参对这个地址的操作,在实参那里也会看到效果

#includestdio.h

void add(int *a,int *b)

{

*a=*a+*b;//改变了形参a的值

return *a;

}

void main()

{

int a=1,b=2;

printf("%d\n",add(a,b));//3

printf("%d\n",a);//3

printf("%d\n",b);//2

}

C语言 传值 传址 传引用

我来详细解释一下: void test1(int a)

{

a = 100; //这里的a是根据参数a而构造出的一个副本,暂存于栈中,与实际参数a完全处于不同内存。

//当函数退出时,a自动无效,修改a的值只是修改栈中这个a的值,无法修改实参。

//如果使用的是C++传递的是一个类的话,同样需要构造一个副本,函数退出时也会析构

//该副本,因此会加大构造和析构的开销,同时会加大内存开销用于保存临时副本

}void test2(int* a)

{

*a = 1000; //这里的a和传值一样,也是构造的一个副本,不过这个副本是一个指针,同样暂存域栈中

//同样需要加大创建这个指针副本的内存,32位机器为4字节,即存放这个副本用的

//同样与实参a指针处于完全不同的内存

//但是,虽然这两个指针处于不同内存,他们指向的地址却是同一个地址

//我们通过*操作符来解析指针指向的地址的值(简称解引用)

//*a = 5;这句代码的意思是将副本a指向的地址的值改变为5

//由于副本a指向的地址与实参指向的地址相同,即改变了实参指向的地址的值

//因此实参a指向的地址的值变成了5 //可以解释的形象一些,

//假如实参a自身处于内存0x01,它指向地址0x03

//那么这个副本处于的内存不会是0x01(因为它是构造出来的一个副本指针),我们假设它自身地址

//为0x02(只是假设,这个地址值肯定是在栈当中的),而它指向的地址一样是0x03

}void test3(int* a)

{

int tmp;

a = tmp; //接着test2讲,由于这里的a是一个构造的副本,如果我们改变它,让它指向tmp的地址

//就不会改变实参指向的地址的值,这里只是将副本指向的地址改变了而已 //解释的形象一些,

//同理假设实参a自身内存为0x01,它指向地址0x03

//这里的a的自身内存为0x02,它也指向地址0x03

//tmp地址为0x04

//a = tmp;这句代码的意思是让a指向tmp的地址,即副本a指向了tmp地址0x04

//而实参a指向的地址的值没有发生任何变化

*a = 10000; //这里对形参a的任何操作已经于实参a毫无任何关系了

//因为它自身地址是0x02,它指向的地址是0x04

}void test4(int a)

{

a = 100000; //这里的a与实参a完全一样了,在这里对a的任何操作等价于对实参a的操作

}

void main()

{

int a = 1;

int b = 2;

int c = 3;

int d = 4; printf("操作前各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d); test1(a);

test2(b);

test3(c);

test4(d); printf("操作后各值\na:%d\tb:%d\tc:%d\td:%d\n", a, b, c, d);

} 附图:


分享名称:c语言函数传地址和引用,c语言引用传递和地址传递
转载注明:http://chengdu.cdxwcx.cn/article/phdpep.html