📜  C和C++中的“ void *”有何区别?(1)

📅  最后修改于: 2023-12-03 15:30:14.918000             🧑  作者: Mango

C和C++中的“void *”有何区别?

在C和C++中,void *是一种通用的指针类型,可以表示任何类型的指针。它通常用于将指针传递给函数,而不需要指定具体的类型。然而,在C和C++中,void *有几个重要的区别。

C中的void *

在C中,void *是一种通用的指针类型,可以指向任何类型的数据。它可以用于创建通用函数,以便可以处理任何类型的指针参数。下面是一个示例:

void swap(void *a, void *b, size_t size) {
    void *temp = malloc(size);
    memcpy(temp, a, size);
    memcpy(a, b, size);
    memcpy(b, temp, size);
    free(temp);
}

int main() {
    int a = 10, b = 20;
    swap(&a, &b, sizeof(int));
    printf("a = %d, b = %d", a, b);
    return 0;
}

在上面的示例中,swap函数是通用的,因为它可以处理任何类型的指针参数。其中的size_t参数指定了指针的大小,以便swap函数可以使用memcpy函数进行复制。

C++中的void *

在C++中,void *也是一种通用的指针类型,可以指向任何类型的数据。但是,C++具有强大的类型系统,因此使用void *通常被认为是一种“糟糕的做法”。它使得代码难以理解和维护,并且容易导致类型错误。为了解决这个问题,C++引入了template和泛型编程。

例如,可以将上面的示例重写为使用模板而不是void *

template<typename T>
void swap(T *a, T *b) {
    T temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int a = 10, b = 20;
    swap(&a, &b);
    cout << "a = " << a << ", b = " << b << endl;
    return 0;
}

在上面的示例中,swap函数使用模板而不是void *。这使得代码更易于理解和维护,并且可以避免类型错误。

总结

在C和C++中,void *是一种通用的指针类型,可以指向任何类型的数据。在C中,使用void *是合法的,因为C缺乏强大的类型系统。但是,在C++中,使用void *通常被认为是不好的做法,因为它使得代码难以理解和维护,并且容易导致类型错误。为了解决这个问题,C++引入了template和泛型编程。