指针--传参指针

一般简单的入参

指针传递的是地址

入参是指针类型的,那么传入的参数也应该是指针类型的

类型一:指针是单个数据

类型二:指针数组:c,d指针成为数组

  • 但是对于这个方法来说就不知道传过来的指针是单个数据还是数组。
  • 指针代表数组的时候是无法计算数组的长度的:4是指针里面地址的大小(32位的)

sizeof(c)算的是地址(地址大小跟位数有关)

c所指向的区域只计算第一个元素的大小(*开头表示指向的区域的第一个元素的大小)

sizeof(*c)算的是c指针指向区域数组的第一个元素的大小(与数据类型有关)

一个地址占的空间sizeof()与程序的位数有关

操作系统(程序)的位数由cpu单次运行的次数决定

32位:4字节

64位:8字节

64位的安装64位时,所占空间为8字节;安装32位时,所占空间为4字节.32位只能安装32位的。(程序>操作系统>CPU)不同程序位数可能不同。

指针代表数组时,因为无法计算数组的长度,所以它根本不知道传进来代表数组的时候数量多少个。无法知道数量有多少个,它就没办法做到处理了要给他的个数。

  • 所以用这个函数,要给返回值的(return 3是应付的,不用管):

所以看有配套的数字就传的是数组

  • 没有返回值

数组类型作为参数传参时都变为了指针,无法计算了,所以还是上面的那种指针传参方式算,所以最后只要是数组传参最后都是指针数组,用上面的算。

算的arr和arr2大小都是4,变成指针数组所以无法计算数组长度算的是地址。

<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*`转换需谨慎,确保类型匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值