对应的视屏链接:鲍松山的个人空间_哔哩哔哩_bilibili
目录
1、void*概述
void称为无类型,void*称为无类型指针
void不可以单独定义变量, 却可以定义无类型的指针, 而且所定义的指针有一个好听的名字, 称为泛型指针
所谓泛型指针,其含义是void*类型的指针可以接收一切类型变量的地址
八个字概括void*的品质:上善若水、物归原主
struct Test
{
char a;
double b;
int c;
};
int Sum(int a, int b)
{
return a + b;
}
int main(void)
{
char ch = 'A';
short b = 10;
int i = 100;
float f = 12.3f;
double d = 12.34;
struct Test t;
//ptr可以接收任意类型的地址
void *ptr;
ptr = &ch;
ptr = &b;
ptr = &i;
ptr = &f;
ptr = &d;
ptr = &t;
ptr = ∑
return 0;
}
注意:
如果需要使用void*指针,需要重新强转为具体类型,方可使用,不可直接针对void*进行使用
2、void*指针应用----通用函数
-
void *memcpy(void *dest, const void *src, size_t count)
//memcpy简易实现,不考虑内存重叠问题
void* memcpy(void *dest, const void *src, size_t count)
{
assert(dest!=NULL && src!=NULL);
//必须把void*指针进行char*转换
char *pDest = (char *)dest;
const char *pSrc = (const char*)src;
while (count--)
*pDest++ = *pSrc++;
return dest;
}
-
void qsort( void *base, size_t num, size_t width,
-
int (*compare )(const void *elem1, const void *elem2 ) )
void Swap(void *e1, void *e2, size_t width)
{
for (int i = 0; i < width; ++i)
{
char tmp = *((char *)e1+i);
*((char *)e1 + i) = *((char *)e2 + i);
*((char *)e2 + i) = tmp;
}
}
void qsort(void *base, size_t num, size_t width,
int(*compare)(const void *elem1, const void *elem2))
{
//冒泡排序方式模拟快排
for (int i = 0; i < num - 1; ++i)
{
for (int j = 0; j < num - 1 - i; ++j)
{
if (compare((char*)base + j*width, (char*)base + (j + 1)*width) > 0)
{
Swap((char*)base + j*width, (char*)base + (j + 1)*width, width);
}
}
}
}
通过以上两个例子,需要明白函数是如何做到通用的
其次,还需要掌握这些常用库函数
strlen()、strcpy()、strcat()、strcmp()
memset()、memcmp()、memmove()