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

【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.xdnf.cn/news/577657.html

相关文章:

  • 轻量级高性能Rust HTTP服务器库Hyperlane,助力现代网络服务开发
  • C++:vector容器
  • 心知天气 API 获取天气预报 2025/5/21
  • QML定时器Timer和线程任务WorkerScript
  • 大模型评测与可解释性
  • Day 27 训练
  • Linux中的文件介绍
  • 通过美图秀秀将多张图片合并
  • 【UEFI实战】BIOS编译过程中报错“无法解析的外部符号memcpy”
  • 七: NumPy的使用
  • vue+srpingboot实现多文件导出
  • Unity中GPU Instancing使用整理
  • Python训练Day30
  • 第3周作业-1层隐藏层的神经网络分类二维数据
  • MQTT报文介绍
  • Linux内存分页管理详解
  • Jsoup解析商品信息具体怎么写?
  • 阿里发布扩散模型Wan VACE,全面支持生图、生视频、图像编辑,适配低显存~
  • FreeCAD傻瓜教程-外螺纹的绘制,利用两个实体进行布尔运算来实现
  • 《P1433 吃奶酪》
  • MCU开发学习记录19* - CAN学习与实践(HAL库) - 定时传输、触发传输和请求传输(轮询与中断实现) -STM32CubeMX
  • Python 代码缩进与结构化编程:从基础到风格规范
  • Robotaxi新消息密集释放,量产元年来临谁在领跑?
  • [Java恶补day2] 49. 字母异位词分组
  • 【SW】从3D模型导出dxf图纸
  • 【算法专题十五】BFS解决最短路问题
  • 04_Prometheus监控docker容器(4)
  • 智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”
  • 如何在JavaScript中将数值转换为字符串并赋值给数组——以RuoYi-Vue项目为例
  • Redis Cluster动态扩容:架构原理与核心机制解析