传参

要了解传参首先得清楚实参和形参,下面来描述一下他们的区别

1.形式上

形参:定义一个函数void add(int a, int b),这里的a和b就是形参。

实参: 当你进行函数调用的时候,add(1, 2),这里的1和2就是实参

2.使用

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 

3.内存占用

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

下面来描述传值和传址的区别

传值:把A的数值传到B,改变B,A不会跟着变,B存的是跟A一样的值;

        传值时在内存中新开辟一个空间,将值赋给这个新开辟的空间,其生命周期为该函数调用结束时释放该空闲,计算结果不影响原调用数据内存空间的值。

传址:把A的地址传到B,改变B,A同时跟着变,B存的只是A的地址(类似电脑的快捷方式)

          传址时同样新开辟一个空间,但不同的是将所用数据空间的内存地址存在新开辟的空间中,函数在数据处理过程中由于是地址(指针),即对源数据进行操作,操作后结果影响原数据。

<think>好的,我现在要回答用户关于指针传参的问题。用户可能已经有一些C++的基础,但需要具体的用法示例。首先,我需要回忆指针传参的基本概念,然后结合用户提供的引用内容,特别是引用[2]中的示例代码,来组织回答。 用户提到的引用[1]涉及将类指针转换为void*进行传参,这可能是在多线程或回调函数中的常见做法。引用[2]展示了通过指针交换整数的例子,这是指针传参的经典应用。我需要确保覆盖基本用法、可能的应用场景以及注意事项。 首先,应该解释指针传参的作用,比如允许函数修改外部变量,避免大对象复制的开销。然后通过示例代码来说明,比如交换函数。接着,可能需要提到动态内存分配中的使用,比如创建数组。然后,结合用户提到的类指针转换,说明如何传递类对象指针,并转换为void*再转回来,比如在线程函数中的应用。 需要注意语法正确性,比如在C++中使用`->`访问成员,转换时使用`static_cast`。同时,提醒用户确保指针有效,避免野指针。最后,生成相关问题,帮助用户进一步学习,比如深浅拷贝、函数参数优化、多线程中的数据传递等。 现在要确保回答结构清晰,分点说明,每个部分有示例代码,并正确使用LaTeX格式。同时,引用用户提供的引用内容,但根据问题,引用[2]更相关,而引用[1]涉及类指针转换,可以作为另一个示例。需要检查代码是否正确,比如swap函数的指针解引用,以及类指针转换的部分是否正确。</think>### 指针传参的使用方法与示例 指针传参是C/C++中通过传递变量地址实现数据高效操作的核心技术,其核心作用包括 **直接修改外部变量** **减少大数据拷贝开销**。以下是具体用法示例: --- #### 1. **基本用法:修改变量值** 通过指针传参,函数可直接修改外部变量的值。 **示例(交换两个整数)**: ```cpp #include <iostream> void swap(int* x, int* y) { int temp = *x; // 解引用获取x指向的值 *x = *y; // 修改x指向的内存内容 *y = temp; // 修改y指向的内存内容 } int main() { int a = 5, b = 10; swap(&a, &b); // 传递变量的地址 std::cout << "a=" << a << ", b=" << b; // 输出: a=10, b=5 return 0; } ``` **作用**:函数通过指针直接操作内存,实现变量值的交换[^2]。 --- #### 2. **动态内存管理** 传递指针可操作堆内存中的数据结构(如数组)。 **示例(动态数组初始化)**: ```cpp void initArray(int* arr, int size) { for (int i=0; i<size; i++) { arr[i] = i * 2; // 通过指针修改数组元素 } } int main() { int* arr = new int[5]; initArray(arr, 5); // 传递堆内存地址 delete[] arr; // 释放内存 return 0; } ``` **优势**:避免复制整个数组,提升效率。 --- #### 3. **类对象指针传递** 适用于需要跨函数操作类成员或实现多态的场景。 **示例(类指针转换与多线程传参)**: ```cpp #include <thread> class MyClass { public: int data; MyClass(int val) : data(val) {} }; // 线程函数(参数为void*) void threadFunc(void* arg) { MyClass* obj = static_cast<MyClass*>(arg); // 将void*转回类指针 std::cout << "Data: " << obj->data; } int main() { MyClass obj(100); std::thread t(threadFunc, static_cast<void*>(&obj)); // 类指针转为void* t.join(); return 0; } ``` **关键点**: - 传递类指针时需显式转换为`void*`[^1] - 在线程函数中需反向转换回原始类型。 --- #### 4. **注意事项** - **有效性检查**:传递指针前需确保其非空(如`if (ptr != nullptr)`)。 - **生命周期管理**:避免野指针(如函数返回后局部变量指针失效)。 - **类型安全**:`void*`转换需谨慎,确保类型匹配。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值