鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 万千只cnm

[已解决]c++ 函数传指针 和引用有啥区别

[复制链接]
发表于 2021-9-13 21:47:33 | 显示全部楼层
人造人 发表于 2021-9-13 21:38
"引用" 引用的是已经存在的对象,不创建对象的

....咋们俩是一个意思,但是我想说的是就是引用一个对象,表达距离不同,但是指针可以不用创建对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 21:49:24 | 显示全部楼层
2736946915 发表于 2021-9-13 21:47
....咋们俩是一个意思,但是我想说的是就是引用一个对象,表达距离不同,但是指针可以不用创建对象

不理解你想要表达的是什么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

难怪那么多人老是写一堆全局指针指来指去出各种BUG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 21:53:44 | 显示全部楼层
人造人 发表于 2021-9-13 21:49
不理解你想要表达的是什么

意思就是指针能当引用,引用不能当指针,可以理解引用就是阉了的指针
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 22:01:08 | 显示全部楼层
2736946915 发表于 2021-9-13 21:53
意思就是指针能当引用,引用不能当指针,可以理解引用就是阉了的指针

不理解,^_^
指针和引用在 C++ 层当然是不一样的,在 C++ 层指针和引用完全就是两样东西,但是在汇编语言层,都是一样的,都是一个地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-13 23:05:02 | 显示全部楼层
人造人 发表于 2021-9-13 22:01
不理解,^_^
指针和引用在 C++ 层当然是不一样的,在 C++ 层指针和引用完全就是两样东西,但是在汇编语 ...

指针更为灵活,能做强制转,做各种骚操作,引用不行,规定得死死的,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-13 23:49:10 | 显示全部楼层
人造人 发表于 2021-9-13 21:35
指针和引用一样,都是一个地址,都不需要创建对象的

啥意思
引用和指针作为形参 都不需要额外空间嘛
但是指针本身不是一个对象吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-14 00:35:45 | 显示全部楼层    本楼为最佳答案   
万千只cnm 发表于 2021-9-13 23:49
啥意思
引用和指针作为形参 都不需要额外空间嘛
但是指针本身不是一个对象吗

你非要说指针本身就是一个对象,这也完全可以,不能说你错
下面这么说是可以的
  1. #include <iostream>

  2. class test_t {
  3. public:
  4.     test_t(): n(0) {}
  5. private:
  6.     int n;
  7. };

  8. int main() {
  9.     int a = 0;          // 创建了一个对象 a,类型是 int
  10.     int *pa = &a;       // 创建了一个对象 pa,类型是 int *
  11.     int &ra = a;        // 创建了一个对象 ra,类型是 int &
  12.     test_t t;           // 创建了一个对象 t,类型是 test_t
  13.     test_t *pt = &t;    // 创建了一个对象 pt,类型是 test_t *
  14.     test_t &rt = t;     // 创建了一个对象 rt, 类型是 test_t &
  15.     return 0;
  16. }
复制代码



下面这个代码,你说调用函数 func 的时候,变量 c,需要额外空间吗?
如果你说需要,那么变量 a 和变量 b 也需要
如果你说变量 c 不需要,那么变量 a 和变量 b 也不需要
变量 a,b,c,这 3 个变量是一样的,都是函数的参数,都是局部变量
不一样的地方也有
变量 c 中存储的是数字 0,变量 c 占用 4 个字节的内存空间
变量 a 和变量 b 中存储的都是同一个数字,这个数字的值是 &x,这个 &x 就是一个地址,一个数字,一个比较大的数字
变量 a 和变量 b,占用 8 个字节
而变量 c 占用 4 个字节
注意,这是在我这边,在别的机器上,输出可能会不一样
  1. #include <iostream>

  2. void func(int &a, int *b, int c) {
  3.     printf("a: %lu\n", sizeof(a));
  4.     printf("b: %lu\n", sizeof(b));
  5.     printf("c: %lu\n", sizeof(c));
  6. }

  7. int main() {
  8.     int x = 0;
  9.     func(x, &x, x);
  10.     return 0;
  11. }

  12. /*
  13. a: 4
  14. b: 8
  15. c: 4
  16. */
复制代码


这里输出的 a 是 4,但是变量 a 不是占用 4 个字节,一定不是,一定是和变量 b 相同,b 是 8,a 一定是 8
之所以这里输出的 a 是 4,是因为这是在 C++ 层,因为变量 a 引用了 变量 x,这里的 sizeof(a),就是 sizeof(x),所以会得到 4,但是在汇编语言层,变量 a 占用 8 个字节,和变量 b 一样
  1. main:
  2. .LFB1738:
  3.         pushq        %rbp
  4.         .seh_pushreg        %rbp
  5.         movq        %rsp, %rbp
  6.         .seh_setframe        %rbp, 0
  7.         subq        $48, %rsp
  8.         .seh_stackalloc        48
  9.         .seh_endprologue
  10.         call        __main
  11.         movl        $0, -4(%rbp)        # int x = 0;
  12.         movl        -4(%rbp), %ecx      # c 使用 movl 指令,4 个字节
  13.         leaq        -4(%rbp), %rdx      # b 使用 leaq 指令,8 个字节
  14.         leaq        -4(%rbp), %rax      # a 使用 leaq 指令,8 个字节
  15.         movl        %ecx, %r8d
  16.         movq        %rax, %rcx
  17.         call        _Z4funcRiPii        # call func
  18.         movl        $0, %eax
  19.         addq        $48, %rsp
  20.         popq        %rbp
  21.         ret
复制代码



也就是说,所有的对象都不需要额外的空间,有这个对象本身的空间就够了
函数的参数就是个局部变量
具体每一个对象占用多少字节,用 sizeof 算一下就是了
但是,但是这个 sizeof 对引用无效,一个引用 使用 sizeof 算出来的是 引用的那个对象的大小,不是引用本身的大小,引用本身的大小和指针的大小是一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-14 09:06:54 | 显示全部楼层
学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-14 12:32:40 | 显示全部楼层
人造人 发表于 2021-9-14 00:35
你非要说指针本身就是一个对象,这也完全可以,不能说你错
下面这么说是可以的

高手高手啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-14 13:08:37 | 显示全部楼层
人造人 发表于 2021-9-14 00:35
你非要说指针本身就是一个对象,这也完全可以,不能说你错
下面这么说是可以的

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-14 14:21:15 | 显示全部楼层
反正引用用起来方便,省得在修改实参时还要带个*号,左右引用在函数中都很有用的!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 18:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表