首页 > 编程笔记 > C语言笔记 阅读:11

C语言void*指针类型的用法(附带实例)

讲解 C语言 void* 指针类型之前,先来看下面程序中的 swap() 函数,为了实现交换两个 int 类型的变量,必须向 swap() 函数中传入指向这两个 int 类型变量的指针:
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,循环地交换两个内存块中的内容。循环的每次迭代都会执行以下操作:
这样,在循环结束后,两个内存块中的内容就被完全交换了。只要提供了正确的内存块大小,这个函数就可以用于交换任意类型的数据。

需要注意的是,在使用 swap() 函数时,需要保证传入的内存块大小和实际数据类型的大小一致,否则可能会导致数据出错。

相关文章