万千只cnm 发表于 2021-9-11 20:40:23

c++ 函数传指针 和引用有啥区别

int abc(int &a,int &b,int &c)
...
传引用的话,是不是不用创建一个临时的对象(不用临时空间
而传指针的话 , 还要创建一个指针对象


百度查了查,都是抄来抄去的{:5_100:}

Max472 发表于 2021-9-11 20:55:46

都要用临时空间吧,局部变量的作用域都是在创建它的那个函数的开始到结束

Max472 发表于 2021-9-11 21:42:48

https://www.zhihu.com/question/37608201
视频中说引用的本质是常量指针

人造人 发表于 2021-9-11 23:20:29

而传指针的话 , 还要创建一个指针对象
传指针也不需要创建对象,指针就是一个地址

routty 发表于 2021-9-12 08:15:14

函数运行时的时候,数据一般是放在栈里面的,等函数运行结束,栈会恢复原来的状态。也就是函数内的局部变量会作废。所以函数体内要改变函数外的数据,必定要告诉函数地址。因而引用也需要在函数调用前就需要开辟一临时空间用于存储地址。但64位代码和一些编译器也会把地址存入CPU的寄存器中而不是在内存中开辟一临时空间。其实在函数中计算机处理指针变量在这里和引用没什么区别

lhgzbxhz 发表于 2021-9-12 11:04:41

引用在绝大多数情况下都是用指针实现的
所以你可以认为对于编译后的源码,指针和引用没有任何区别

jhanker 发表于 2021-9-13 13:35:46

routty 发表于 2021-9-12 08:15
函数运行时的时候,数据一般是放在栈里面的,等函数运行结束,栈会恢复原来的状态。也就是函数内的局部变量 ...

原来你是个高手,深藏不露!

sunyt 发表于 2021-9-13 13:54:38

同{:10_256:}学

2736946915 发表于 2021-9-13 21:06:02

指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,

routty 发表于 2021-9-13 21:07:36

2736946915 发表于 2021-9-13 21:06
指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,

指针变量也不一定在栈区的

2736946915 发表于 2021-9-13 21:13:02

指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,
引用是要创建对象的,传的也是一个地址,但是是对象的地址,数据是保存在堆区,会直接修改外面的值,

总结一下就是:
传指针为了临时用用,不想它对外面的数据改来改去,随便玩对外面数据不造成影响,
传引用能改变外面的数据,为了改变某个状态,某个变量之类的,不然数据改了后可能会导致其他地方出现BUG

2736946915 发表于 2021-9-13 21:14:08

lhgzbxhz 发表于 2021-9-12 11:04
引用在绝大多数情况下都是用指针实现的
所以你可以认为对于编译后的源码,指针和引用没有任何区别

还是有区别的,一个栈区的生命怎么能和堆区比...

2736946915 发表于 2021-9-13 21:17:46

routty 发表于 2021-9-13 21:07
指针变量也不一定在栈区的

那是静态变量,分配在堆上,这种情况很少,一般都会封装,

人造人 发表于 2021-9-13 21:34:29

2736946915 发表于 2021-9-13 21:13
指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,
引用是要创建 ...

?
#include <iostream>

void func(int *p) {
    *p = 123;
}

int main() {
    int a = 0;
    printf("%d\n", a);
    func(&a);
    printf("%d\n", a);
    return 0;
}


#include <iostream>

void func(const int &p) {
    p = 123;
}

int main() {
    int a = 0;
    printf("%d\n", a);
    func(a);
    printf("%d\n", a);
    return 0;
}

routty 发表于 2021-9-13 21:35:11

2736946915 发表于 2021-9-13 21:13
指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,
引用是要创建 ...

全局指针变量,也不是随便用用的。应该说函数内的局部变量,包括局部指针变量,或形参是指针变量的那是在栈区,函数结束就会被作废

人造人 发表于 2021-9-13 21:35:16

2736946915 发表于 2021-9-13 21:13
指针是一个地址,但是他的数据在栈里,在代码块结束后就会还原,不会对外面的数据造成影响,
引用是要创建 ...

指针和引用一样,都是一个地址,都不需要创建对象的

2736946915 发表于 2021-9-13 21:37:12

人造人 发表于 2021-9-13 21:35
指针和引用一样,都是一个地址,都不需要创建对象的

引用没有对象你引用谁?编译器都会直接报错

人造人 发表于 2021-9-13 21:38:24

2736946915 发表于 2021-9-13 21:37
引用没有对象你引用谁?编译器都会直接报错

"引用" 引用的是已经存在的对象,不创建对象的

2736946915 发表于 2021-9-13 21:44:49

routty 发表于 2021-9-13 21:35
全局指针变量,也不是随便用用的。应该说函数内的局部变量,包括局部指针变量,或形参是指针变量的那是在 ...

全局的确实也是,但是极不推荐,这样做会害死其他人,让别人都不敢碰你代码,一般来说都会去写个接口函数,一为减少BUG,二为安全,别人破解也不会那么简单找到你的ECX,

routty 发表于 2021-9-13 21:45:57

人造人 发表于 2021-9-13 21:38
"引用" 引用的是已经存在的对象,不创建对象的

对,其实底层汇编以后处理方式和指针差不多,
页: [1] 2
查看完整版本: c++ 函数传指针 和引用有啥区别