当前位置: 首页 > article >正文

【C++ Primer 学习札记】函数传参问题

 

参考博文:

https://blog.csdn.net/weixin_40026739/article/details/121582395

什么是形参(parameter),什么是实参(argument)

1. 形参

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参

形参是函数声明或定义时列出的参数,本质是函数作用域内的局部变量,用于接收调用时传入的数据。形参在函数被调用前没有实际内存分配,仅作为占位符存在。

特点​​:

在函数声明和定义中声明,例如:int add(int a, int b)中的a和b是形参。

形参的类型必须明确指定,且可以是变量或引用类型(如指针或引用)。

形参的作用域仅限于函数内部,函数执行结束后会被释放。

参考【C语言编译】C语言的函数调用的过程_c语言函数的调用过程是什么-CSDN博客

函数调用过程中,栈区(stack)可以存放函数的参数值,局部变量的值等,由编译器自动分配释放

2. 实参

给形参传递值的变量称为实际参数,简称实参

实参是函数调用时传递给形参的具体值或变量,包含实际的数据,用于初始化形参

特点​​:

可以是常量、变量、表达式、指针或引用。例如:add(3, 5)中的3和5是实参。

实参的类型必须与形参匹配,否则会触发隐式类型转换(如char转int),若无法转换则报错。

实参的值通过​​值传递​​、​​引用传递​​或​​指针传递​​方式传递给形参,其中值传递会复制数据,后两者直接操作内存地址

这里列举形参为指针以及指针的指针的情况:

1. 形参为指针,实参为变量的地址

当数据类型需要占用大量内存时候,可以避免数据拷贝

void test_ptr(int* data){std::cout<<*data<<std::endl;
}
int main() {int data = 1;test_ptr(&data);return 0;
}

输出为:

1

2. 形参为指针,实参为指针

数组变量,本质上是数组首元素的地址

void test_ptr4(int* data){std::cout<<data[1]<<std::endl;data[1] = 2;std::cout<<data[1]<<std::endl;
}
int main() {int* data = nullptr;data = new int[10];data[1] = 1;test_ptr4(data);std::cout<<data[1]<<std::endl;delete[] data;return 0;
}

输出:

1

2

2

特别注意:如果形参为指针时,在函数内部对其动态分配内存,是不能影响到外部的指针变量的,如下所示:

void test_ptr3(int* data){data = new int[10];// data[1] = 1;data[1] = 1;std::cout<<data[1]<<std::endl;
}
int main() {int* data = nullptr;test_ptr3(data);std::cout<<data[1]<<std::endl;//errorreturn 0;
}

输出:

1
段错误 (核心已转储)

3. 形参为指针的指针,实参为指针变量的地址

这里可以支持在函数内部对外部的空指针进行动态分配内存

void test_ptr2(int** data){*data = new int[10];(*data)[1] = 1;
}
int main() {int* data = nullptr;test_ptr2(&data);std::cout<<data[1]<<std::endl;delete[] data;return 0;
}

输出为:

1

 

http://www.lryc.cn/news/2383508.html

相关文章:

  • 软件的技术架构、应用架构、业务架构、数据架构、部署架构
  • CSS 文字样式全解析:从基础排版到视觉层次设计
  • 【高德开放平台-注册安全分析报告】
  • [特殊字符] React Fiber架构与Vue设计哲学撕逼实录
  • RabbitMQ的简介
  • 混合学习:Bagging与Boosting的深度解析与实践指南
  • 使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第一部分)
  • 大语言模型 16 - Manus 超强智能体 Prompt分析 原理分析 包含工具列表分析
  • 物联网赋能7×24H无人值守共享自习室系统设计与实践!
  • 以太联Intellinet带您深度解析PoE交换机的上行链路端口(Uplink Ports)
  • 浏览器播放 WebRTC 视频流
  • 从零开始:使用 PyTorch 构建深度学习网络
  • 分类算法 Kmeans、KNN、Meanshift 实战
  • 【razor】回环结构导致的控制信令错位:例如发送端收到 SR的问题
  • 网络安全之身份验证绕过漏洞
  • MySQL 主从复制搭建全流程:基于 Docker 与 Harbor 仓库
  • vscode打开vue + element项目
  • Django框架的前端部分使用Ajax请求一
  • cmd如何从C盘默认路径切换到D盘某指定目录
  • 693SJBH基于.NET的题库管理系统
  • [Vue]跨组件传值
  • 每日Prompt:实物与手绘涂鸦创意广告
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.8)
  • vue3 在线播放语音 mp3
  • Ubuntu部署私有Gitlab
  • genicamtl_lmi_gocator_objectmodel3d
  • [LevelDB]LevelDB版本管理的黑魔法-为什么能在不锁表的情况下管理数据?
  • bisheng系列(二)- 本地部署(前后端)
  • 【网络编程】十二、两万字详解 IP协议
  • Linux探秘:驾驭开源,解锁高效能——基础指令