c++指针传递与引用传递
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++指针传递与引用传递的更多相关文章
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- C++中值传递、指针传递、引用传递的总结
C++中值传递.指针传递.引用传递的总结 指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...
- Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值
Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...
- C++ 值传递、指针传递、引用传递详解
C++ 值传递.指针传递.引用传递详解 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式” 数组和指针背后——内存角度 语义"陷阱&quo ...
- C++指针传递和引用传递的区别 (转载整理)
区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址. 就拿 交换两个数的函数来举例: // 指针传递 void swap(int * val1, ...
- 【转】C++ 值传递、指针传递、引用传递详解
而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~ 下文会通过例子详细说明哦 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角 ...
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- C++面试常见问题——15函数的值传递、指针传递、引用传递
函数的值传递.指针传递.引用传递 值传递 形参是实参的拷贝,该表形参的值并不会影响外部的实参.值传递是单向的(实参-->形参),参数的值只能传入,不能传出.当函数内部需要修改参数并且不影响调用者 ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
随机推荐
- 图解ArrayList源码
初始化数组长度为空时, 懒加载 add方法 初始无参构造器 第一次添加 public boolean add(E e) { // 确定容量 动态扩容 size 初始 0 ensureCap ...
- Docker的启停与配置等
Docker测试题 一.选择题(每题5分) 1.关于Docker 安装的表述错误的是(C) A.Docker支持在Windows.Linux.MacOS等系统上安装 B.CentOS安装Docker有 ...
- 正确停止Oracle expdp/impdp作业操作方法
1.使用命令查看在运行的作业名称,找到STATE是EXECUTING的作业名称. select job_name,state from dba_datapump_jobs; 2.再CMD命令窗口,键入 ...
- IDEA 接入 DeepSeek,太酷了!
你好,我是 Guide.前两天,我发文提到 DeepSeek 的回答推荐了我的资料 <JavaGuide 面试突击版>(PDF):DeepSeek 的这波回答我给满分!. 这篇文章简单介绍 ...
- GUI编程之AWT
介绍 包含了很多类和接口 元素:窗口.按钮.文本框 java.awt Frame 就是一个窗口 实现 package com.yeyue.lesson01;import java.awt.*;pu ...
- 从 14 秒到 1 秒:MySQL DDL 性能优化实战
1. 问题背景 MySQL版本:8.0.30 测试表数据量:200万 在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置 ...
- Java中编译期异常和运行期异常的区别
在Java中,异常分为运行期异常(Runtime Exception)和编译期异常(Checked Exception),两者的核心区别在于 编译器是否强制要求处理.以下是它们的详细对比: 1. 定义 ...
- 【效能提升】上线前漏了SQL脚本,漏加上某个配置项了?
背景 一个版本从开始开发到上线,可能经历10多天,甚至更久. 由于这个过程的时间较长,难免出现某些需要执行的SQL脚本.需要配置的配置项,到了上线前,却被遗漏了,最后导致出现线上问题才发现. 我们团队 ...
- Deepseek学习随笔(8)--- 清华大学发布Deepseek从入门到精通(附网盘链接)
文档简介:AI时代的新工具手册 清华大学新闻与传播学院联合元宇宙文化实验室发布的<DeepSeek从入门到精通>,是一份系统化.实战性极强的AI工具学习指南.文档聚焦国产开源通用人工智能工 ...
- Oracle - [03] 存储过程
一.什么是存储过程 存储过程是一种数据库对象,是一种存储在数据库中的可执行程序,是一些经过编写.编译而存在数据库中的SQL语句集. 二.创建存储过程的语法 create or replace proc ...