C语言void*指针类型的用法(附带实例)
讲解 C语言 void* 指针类型之前,先来看下面程序中的 swap() 函数,为了实现交换两个 int 类型的变量,必须向 swap() 函数中传入指向这两个 int 类型变量的指针:
为了使 swap() 函数更加通用,我们可以使用 void* 指针。void* 指针是一种通用指针类型,可以指向任何类型的数据。
修改后的 swap() 函数如下:
void* 指针是一种特殊的指针类型,可以指向任何数据类型的对象。与其他类型的指针不同,void* 指针不能直接对其指向的对象进行操作,因为编译器无法确定其指向的数据类型及其大小。
例如:
根据上述的内容,我们可以对 swap() 函数进行修改,使其能够交换不同类型的变量,代码如下:
然后,我们定义了一个 char 类型的变量 temp,用于在交换过程中存储临时数据。
接着,我们使用一个 for 循环,从 0 到 size - 1,循环地交换两个内存块中的内容。循环的每次迭代都会执行以下操作:
这样,在循环结束后,两个内存块中的内容就被完全交换了。只要提供了正确的内存块大小,这个函数就可以用于交换任意类型的数据。
需要注意的是,在使用 swap() 函数时,需要保证传入的内存块大小和实际数据类型的大小一致,否则可能会导致数据出错。
void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; }但是,参数类型指定为 int*,使得函数 swap() 只能交换 int 类型的变量。如果我们想让 swap() 更加通用,能够交换不同类型的变量,那么该怎么办呢?
为了使 swap() 函数更加通用,我们可以使用 void* 指针。void* 指针是一种通用指针类型,可以指向任何类型的数据。
修改后的 swap() 函数如下:
void swap(void *x, void *y, int size)上述代码中的参数 x 和 y 都是 void* 指针类型。
void* 指针是一种特殊的指针类型,可以指向任何数据类型的对象。与其他类型的指针不同,void* 指针不能直接对其指向的对象进行操作,因为编译器无法确定其指向的数据类型及其大小。
例如:
int n; void *p = &n; // int *赋值给void *,仅保存首地址,丢失了数据类型 *p; // 错误,无法确定数据类型和大小,因此无法取值 p + 1; // 错误,无法确定数据类型和大小,因此无法进行加减运算同时,上面的代码还增加了一个参数 size,这个参数表示要交换的内存块的大小,单位是字节。例如:如果需要交换 char 类型的数据,那么将 size 参数传递给 sizeof(char),也就是 1 字节;如果需要交换 double 类型的数据,那么将 size 参数传递给 sizeof(double),也就是 8 字节。
根据上述的内容,我们可以对 swap() 函数进行修改,使其能够交换不同类型的变量,代码如下:
#include <stdio.h> void swap(void* x, void* y, int size) { // 将指针转换为char *,单个字节操作内存 char* pX = x; char* pY = y; char temp; for (int i = 0; i < size; i++) { temp = pX[i]; pX[i] = pY[i]; pY[i] = temp; } } int main() { double a = 3.0, b = 5.0; printf("a=%f b=%f\n", a, b); // 交换变量 a 和 b swap(&a, &b, sizeof(double)); printf("a=%f b=%f\n", a, b); return 0; }首先,swap() 函数将两个 void* 类型的指针 x 和 y 转换为 char* 类型的指针 pX 和 pY。这样做的原因是,char 类型的大小为 1 字节,这允许我们在后面的循环中逐字节地操作内存。
然后,我们定义了一个 char 类型的变量 temp,用于在交换过程中存储临时数据。
接着,我们使用一个 for 循环,从 0 到 size - 1,循环地交换两个内存块中的内容。循环的每次迭代都会执行以下操作:
- 将 pX 指针指向的内存块中的第 i 个字节保存到 temp 中;
- 将 pY 指针指向的内存块中的第 i 个字节复制到 pX 指向的内存块的第 i 个字节;
- 将 temp 中的值复制到 pY 指向的内存块的第 i 个字节。
这样,在循环结束后,两个内存块中的内容就被完全交换了。只要提供了正确的内存块大小,这个函数就可以用于交换任意类型的数据。
需要注意的是,在使用 swap() 函数时,需要保证传入的内存块大小和实际数据类型的大小一致,否则可能会导致数据出错。