c 不支持引用传递的!

在 C++中,指针传递和引用传递是两种常用的参数传递方式,它们各自有不同的特点和适用场景。下面是两者之间的主要区别:

1. 语法和使用

指针传递

  • 定义和调用:函数参数是一个指针类型,调用时需要传递变量的地址。
  • 解引用:在函数内部需要使用解引用操作符 * 来访问指针指向的值。
  • 示例
    void modifyValuePointer(int *p) {
    *p = 20; // 修改指针所指向的值
    } int main() {
    int value = 10;
    modifyValuePointer(&value); // 传递变量的地址
    return 0;
    }

引用传递(引用的本质在c++内部实现是一个指针常量.

  • 定义和调用:函数参数是一个引用类型,调用时直接传递变量本身。
  • 直接使用:在函数内部可以直接使用引用变量,就像操作原始变量一样。
  • 示例
    void modifyValueReference(int &ref) {
    //int& ref = value;
    //自动转换为 int* const ref = &value;
    //指针常量是指针指向不可改,指针指向的值可以更改,这也说明为什么引用不可更改 ref = 20; // 直接修改引用绑定的对象
    } int main() {
    int value = 10;
    modifyValueReference(value); // 直接传递变量
    return 0;
    }

2. 安全性

指针传递

  • 空指针:指针可以是 nullptr,因此在使用指针之前需要检查是否为 nullptr,以避免未定义行为。
  • 示例
    void modifyValuePointer(int *p) {
    if (p != nullptr) {
    *p = 20;
    } else {
    std::cerr << "Error: Null pointer" << std::endl;
    }
    }

引用传递

  • 不能为空:引用必须绑定到一个有效的对象,不能是 nullptr,因此不需要进行空指针检查。
  • 示例
    void modifyValueReference(int &ref) {
    ref = 20; // 不需要检查空指针
    }

3. 可变性

指针传递

  • 重新绑定:指针可以在函数内部重新指向其他对象。
  • 示例
    void changePointer(int *p, int *q) {
    p = q; // 只改变局部变量 p 的值,不影响调用者
    } int main() {
    int a = 10, b = 20;
    int *ptr = &a;
    changePointer(ptr, &b); // ptr 仍然指向 a
    return 0;
    }

引用传递

  • 不可重新绑定:引用一旦绑定到某个对象后,就不能重新绑定到其他对象。
  • 示例
    void changeReference(int &ref, int &otherRef) {
    // ref = otherRef; // 这只是修改了 ref 绑定的对象的值,不是重新绑定引用
    } int main() {
    int a = 10, b = 20;
    int &ref = a;
    changeReference(ref, b); // ref 仍然绑定到 a
    return 0;
    }

4. 性能

指针传递

  • 额外开销:指针传递可能需要额外的解引用操作,这可能会带来一些性能开销。

引用传递

  • 优化:编译器通常会对引用进行优化,使得引用传递的性能与直接传递变量相同或接近。

5. 可读性和简洁性

指针传递

  • 可读性:指针传递需要显式地使用解引用操作符,这可能会使代码稍微复杂一些,尤其是对于初学者来说。

引用传递

  • 简洁性:引用传递更加简洁和直观,代码更容易理解和维护。

总结

  • 指针传递:适用于需要灵活地重新绑定对象或需要显式检查空指针的场景。
  • 引用传递:适用于需要保证参数非空且希望代码更简洁、更安全的场景。

c++指针传递与引用传递的更多相关文章

  1. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  2. C++中值传递、指针传递、引用传递的总结

    C++中值传递.指针传递.引用传递的总结   指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...

  3. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  4. C++ 值传递、指针传递、引用传递详解

    C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...

  5. C++指针传递和引用传递的区别 (转载整理)

    区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址. 就拿 交换两个数的函数来举例: // 指针传递 void swap(int * val1, ...

  6. 【转】C++ 值传递、指针传递、引用传递详解

    而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...

  7. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  8. C++面试常见问题——15函数的值传递、指针传递、引用传递

    函数的值传递.指针传递.引用传递 值传递 形参是实参的拷贝,该表形参的值并不会影响外部的实参.值传递是单向的(实参-->形参),参数的值只能传入,不能传出.当函数内部需要修改参数并且不影响调用者 ...

  9. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  10. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

随机推荐

  1. MPC收藏

    收集有关MPC的优秀文章,方便查阅. 同态加密 原理 介绍 程序员的干货!核心理论之同态加密 https://mp.weixin.qq.com/s/1uH0UjnS_Mo8ShXJ-16UXw BGV ...

  2. 玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!

    本文分享自天翼云开发者社区<玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!>,作者:天翼云社区官方账号 Super Idol的笑容虽然非常甜 无数粉丝宝宝的心里却 ...

  3. Q:Linux符号连接的层数过多

    创建符号链接的时候源文件一定要使用绝对路径,尤其是链接不在同一目录时候,用相对路径会出现这种bug,具体是红色闪烁状态.:正常应该是青绿色  例如: 安装zabbix_agent遇到的问题,在root ...

  4. linux mint安装触控板手势fusuma

    安装必要的包,终端输入: sudo apt-get install libinput-tools sudo apt-get install xdotool sudo gem install fusum ...

  5. maven项目中解决 .git文件太大问题

    一.git项目上传后项目文件太大,git filter-branch手动清理 最近发现一个项目git目录已经达到200MB,严重影响了clone代码.操作之前请全量备份代码,操作失误可恢复 二.测试项 ...

  6. 库卡机器人KR3R540电源模块常见故障维修解决方法

            库卡机器人KR3R540电源模块的常见故障及维修解决方法包括:           电源模块无法正常启动:应检查电源模块的电源连接是否正常,以及电源开关是否开启.如果电源连接正常,但驱 ...

  7. 最优化算法Nesterov Momentum牛顿动量法

    这是对之前的Momentum的一种改进,大概思路就是,先对参数进行估计,然后使用估计后的参数来计算误差 具体实现: 需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α每步迭代过程:

  8. Docker - 在docker中部署Nginx

    1.docker search 查找ngix 2.docker pull下载镜像 3.查看镜像列表 4.docker run启动容器 5.测试nginx容器是否启动成功 1.docker search ...

  9. 清华大学推出的5册免费的 DeepSeek 学习使用指南!

    前言 在当今这个信息洪流.技术飞速迭代的时代,DeepSeek的横空出世极大地降低了普通人利用人工智能技术的门槛.然而,尽管机遇就在眼前,仍有不少朋友面对DeepSeek感到无从下手,不知如何利用它来 ...

  10. 基于ThreeJs的大屏3D地图(二)——气泡图、渐变柱体与热力图

    前提 上一篇文章中我们完成了地图区块模型的渲染,在此基础之上本篇来讲解气泡图.3D柱形图以及3D热力图的实现方式. 首先,为了更好的关注点分离及与地图渲染模块的解耦,我们可以把所有类型的可视化元素抽象 ...