0

0

C++ 指针参数怎么传递 C++ 传值与传地址的区别演示【函数】

冰火之心

冰火之心

发布时间:2026-02-03 09:34:03

|

349人浏览过

|

来源于php中文网

原创

C++默认按值传递参数,包括指针本身;要修改指针变量的指向,须传二级指针(int*)或指针引用(int&),后者更安全自然。

c++ 指针参数怎么传递 c++ 传值与传地址的区别演示【函数】

函数里改不了原始变量?那大概率传的是值

当函数内部修改了参数,但调用方的变量没变,说明你传的是副本——也就是按值传递。C++ 默认所有参数都是传值,包括指针变量本身。比如 void foo(int* p),传进来的 p 是原指针的拷贝,你能通过它改它指向的内存(如 *p = 42),但没法让调用方的指针变量指向别处(比如在函数里写 p = new int(99),外面的指针不受影响)。

常见错误现象:
- 想在函数里分配内存并让调用方拿到新地址,结果调用方指针仍是 nullptr 或旧地址;
- 函数里对指针做了 ++p,返回后原指针没动。

  • 传值:函数得到的是指针变量的副本,地址值相同,但变量本身独立
  • 想让函数能“重绑定”指针(即改变指针变量本身的值),必须传指针的地址(即 int**)或引用(int*&
  • 性能上,传指针比传大对象(如 std::vector)便宜,但传指针本身开销仍是复制一个地址(通常 8 字节

想让函数修改指针本身?用指针的指针或引用

如果目标是让函数内部分配内存、并让调用方的指针变量真正指向新地址,就得把指针的地址交给函数——也就是二级指针。或者更现代、更安全的做法:用指针引用。

示例对比:

void alloc_bad(int* p) { p = new int(100); } // 外面看不到 new 出来的地址
void alloc_good(int** p) { *p = new int(100); }
void alloc_clean(int*& p) { p = new int(100); }

调用方式:

立即学习C++免费学习笔记(深入)”;

int* ptr = nullptr;
alloc_good(&ptr);   // 必须取地址
alloc_clean(ptr);   // 语法更自然,语义更清晰
  • int** 易错:容易漏掉 &,也容易误写成 **p = ...(那是改内容,不是改指针)
  • int*& 更符合直觉,且编译器会阻止你传临时量(如 alloc_clean(&x) 这种错误写法直接报错)
  • 两者都避免了拷贝整个对象,但引用形式可读性和安全性更高

传值 vs 传指针 vs 传引用:别只看“能不能改内容”

关键区别不在“能不能改数据”,而在于“谁的数据”和“谁的变量”。同一个 int x = 5;,三种传法行为完全不同:

Spell.tools
Spell.tools

高颜值AI内容营销创作工具

下载
  • func(x):函数收到 x 的副本,改它不影响 x
  • func(&x):函数收到 &x 的副本(即一个 int*),能通过它改 x 的值,但不能让 &x 变成别的地址(因为地址字面量不可变)
  • func(x) 配合 void func(int& r):函数直接操作 x 本体,改 r 就是改 x;且无法传字面量(如 func(5) 报错),除非加 const

注意:int*int& 都能实现“修改原始值”,但语义不同:前者强调“我操作的是某块内存”,后者强调“我操作的就是这个变量”。实际选型时,优先用引用(&)代替裸指针(*)做输入/输出参数,除非需要空值(nullptr)语义。

const 修饰位置决定你能干什么

const 放在指针声明的不同位置,约束的对象完全不同,直接影响函数能否修改数据或指针本身:

void f1(const int* p);  // *p 不可改(数据只读),p 可改(指针可移动)
void f2(int* const p);  // p 不可改(指针固定),*p 可改(数据可写)
void f3(const int* const p); // 两者都不可改

最常见的是 f1 形式,用于只读访问外部数据(如字符串字面量、只读缓冲区)。如果你发现函数里被禁止写 *p = ...,检查是不是加了前面的 const;如果被禁止写 p++p = ...,那就是后面的 const 在起作用。

  • 传参时加 const 不仅是自我约束,更是接口契约:告诉调用方“我不会改你的数据”
  • 编译器可能据此做优化(如缓存值、省去重读)
  • 但要注意:const int* p 允许你把一个非 const 变量的地址传进去,只是函数内部不能改它

真正容易被忽略的是:指针本身的可变性常被当成理所当然,直到你在函数里试图重新赋值指针却失败,才回头翻声明——这时候看 const 在哪,比猜逻辑快得多。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

533

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

718

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

650

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

175

2025.07.29

Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

12

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.6万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号