大家在C语言的学习过程中肯定见过各种指针符号,如 int*, char* 等等等等。顾名思义,int就是一个指向整形的指针,而char则是一个指向字符的指针,而 “ void* ”是什么呢?本期就为大家介绍 空指针
void指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。
1、void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。
因此void*只能表示一个地址,不能用来&取值,也不能移动指针,因为不知道多少字节是一个数据单位。
2、void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。
3、指针在只知道内存,但是不知道是什么类型的时候。
4、在C/C++中,在任意时刻都可以使用其它类型指针来代替void指针,或者用void指针来代替其他类型指针。
5、对指针变量的解引用,使用间接运算符*达到目的。但是在使用空指针的情况下,需要转换指针变量解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。
也就是说,void*类型的指针可以接受任意类型的指针
但是不能够进行解引用操作,也不能进行加减运算
需要注意的是,void* 即使在接收某一具体类型的指针后,它的类型依然是void*,我们仍然无法对其进行解引用操作,需要进行强制类型转换才可以。
由于空指针的特殊性,我们一般将其运用在函数参数里,用以接收各种类型的参数。
例:
void* e1;
*(int*)e1;
下面附带一个有空指针参与的qsort(快速排序)函数
注1:由于qsort是库函数,因此我在编写时将函数名改为了 ‘my_qsort’
注2:此函数只是向大家展示空指针的应用,其中仍有指针方面的知识,我们会在后续章节具体介绍
qsort 函数
void swap(char*buf1,char*buf2,int width)
//交换函数
{
for (int i = 0;i < width;i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void my_qsort(void* base,int sz,int width, int (*cmp)(void* e1,void* e2))
{
for (int i = 0;i < sz;i++)
{ for (int 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 cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), cmp_int);}
全部0条评论
快来发表一下你的评论吧 !