大家在C語言的學(xué)習(xí)過程中肯定見過各種指針符號,如 int*, char* 等等等等。顧名思義,int就是一個指向整形的指針,而char則是一個指向字符的指針,而 “ void* ”是什么呢?本期就為大家介紹 空指針
void指針一般被稱為通用指針或叫泛指針。它是C語言關(guān)于純粹地址的一種約定。當某個指針是void型指針時,所指向的對象不屬于任何類型。
1、void *表示一個“不知道類型”的指針,也就不知道從這個指針地址開始多少字節(jié)為一個數(shù)據(jù)。和用int表示指針異曲同工,只是更明確是“指針”。
因此void*只能表示一個地址,不能用來&取值,也不能移動指針,因為不知道多少字節(jié)是一個數(shù)據(jù)單位。
2、void *就是一個不能動的“地址”,在進行&、移動指針之前必須轉(zhuǎn)型為類型指針。
3、指針在只知道內(nèi)存,但是不知道是什么類型的時候。
4、在C/C++中,在任意時刻都可以使用其它類型指針來代替void指針,或者用void指針來代替其他類型指針。
5、對指針變量的解引用,使用間接運算符*達到目的。但是在使用空指針的情況下,需要轉(zhuǎn)換指針變量解引用。這是因為空指針沒有與之關(guān)聯(lián)的數(shù)據(jù)類型。編譯器無法知道void指針指向的數(shù)據(jù)類型。因此,要獲取由void指針指向的數(shù)據(jù),需要使用在void指針位置內(nèi)保存的正確類型的數(shù)據(jù)進行類型轉(zhuǎn)換。
也就是說,void*類型的指針可以接受任意類型的指針
但是不能夠進行解引用操作,也不能進行加減運算
需要注意的是,void* 即使在接收某一具體類型的指針后,它的類型依然是void*,我們?nèi)匀粺o法對其進行解引用操作,需要進行強制類型轉(zhuǎn)換才可以。
由于空指針的特殊性,我們一般將其運用在函數(shù)參數(shù)里,用以接收各種類型的參數(shù)。
例:
void* e1;
*(int*)e1;
下面附帶一個有空指針參與的qsort(快速排序)函數(shù)
注1:由于qsort是庫函數(shù),因此我在編寫時將函數(shù)名改為了 ‘my_qsort’
注2:此函數(shù)只是向大家展示空指針的應(yīng)用,其中仍有指針方面的知識,我們會在后續(xù)章節(jié)具體介紹
qsort 函數(shù)
void swap(char*buf1,char*buf2,int width)
//交換函數(shù)
{
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);}
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136841 -
Int
+關(guān)注
關(guān)注
0文章
23瀏覽量
16069 -
符號
+關(guān)注
關(guān)注
0文章
55瀏覽量
4336
發(fā)布評論請先 登錄
相關(guān)推薦
評論