c和c++函数参数为void / void *

本文详细解析了C及C++中函数参数的不同定义方式及其含义,包括无参数函数的两种写法以及如何声明接收任意指针类型的函数。

1. void test(){}

2. void test(void){}

3. void test(void *){}

1和2是相同的,表示test函数不接受任何参数,无论在c还是c++中如果函数不接受参数用2的方式书写是一种良好的习惯

3表示test函数接受一个指针类型的参数,无论是什么指针,只要是指针就可以传入

在CC++编程中,`void *`作为函数参数有其独特的使用方法注意事项。 ### 使用方法 - **通用指针传递**:`void *`是“通用指针”或“无类型指针”,可以指向任何数据类型,而不要求明确指明所指向的数据类型。在创建线程时,需要给线程传递数,线程数就是一个`void`型,这样所有的程序员都可以按照自己的需求传递想要的类型指针,使用时需将自己的数指针强制转换为`(void *)`型 [^1][^2]。 - **内存分配函数**:内存分配函数如`malloc``calloc`返回的就是`void *`类型的指针,因为它们在分配内存时并不关心内存将用于存储什么类型的数据。之后可将这个`void *`指针转换为适当的类型来访问分配的内存 [^4]。 ```c #include <stdio.h> #include <stdlib.h> int main() { // 使用 malloc 分配内存,返回 void * 指针 void *ptr = malloc(10 * sizeof(int)); if (ptr == NULL) { printf("内存分配失败\n"); return 1; } // 将 void * 指针转换为 int * 指针 int *int_ptr = (int *)ptr; for (int i = 0; i < 10; i++) { int_ptr[i] = i; } for (int i = 0; i < 10; i++) { printf("%d ", int_ptr[i]); } free(ptr); return 0; } ``` - **实现通用排序函数**:在实现不同数据类型的排序函数时,`void *`可作为数,结合回调函数实现不同类型数据的排序。例如下面的冒泡排序函数,`base`是指向待排序数组的`void *`指针,`sz`是数组元素个数,`width`是每个元素的大小,`cmp`是比较函数指针 [^5]。 ```c #include <stdio.h> // 交换函数 void Swap(char *p1, char *p2, int width) { for (int i = 0; i < width; i++) { char tmp = *p1; *p1 = *p2; *p2 = tmp; p1++; p2++; } } // 冒泡排序函数 void bubble_sort(void* base, int sz, int width, int(*cmp)(void* e1, void* e2)) { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0) { Swap((char*)base + j * width, (char*)base + (j + 1) * width, width); } } } } // 比较函数 int int_cmp(void* e1, void* e2) { return (*(int*)e1 - *(int*)e2); } int main() { int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz, sizeof(int), int_cmp); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; } ``` ### 注意事项 - **类型转换**:在使用`void *`指针时,必须进行显式的类型转换,因为`void *`指针本身不包含所指向对象的类型信息。如果不进行正确的类型转换,可能会导致未定义行为 [^4][^5]。 - **空指针检查**:在使用`void *`指针之前,应该检查它是否为`NULL`,以避免对空指针进行操作,从而导致程序崩溃 [^4]。 - **生命周期管理**:确保传递给函数的`void *`指针所指向的对象在函数使用期间是有效的。如果传递的是局部变量的指针,要注意该变量的生命周期,避免出现悬空指针的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值