大家在C語言的學(xué)習(xí)過程中肯定見過各種指針符號(hào),如 int*, char* 等等等等。顧名思義,int就是一個(gè)指向整形的指針,而char則是一個(gè)指向字符的指針,而 “ void* ”是什么呢?本期就為大家介紹 空指針
void指針一般被稱為通用指針或叫泛指針。它是C語言關(guān)于純粹地址的一種約定。當(dāng)某個(gè)指針是void型指針時(shí),所指向的對(duì)象不屬于任何類型。
1、void *表示一個(gè)“不知道類型”的指針,也就不知道從這個(gè)指針地址開始多少字節(jié)為一個(gè)數(shù)據(jù)。和用int表示指針異曲同工,只是更明確是“指針”。
因此void*只能表示一個(gè)地址,不能用來&取值,也不能移動(dòng)指針,因?yàn)椴恢蓝嗌僮止?jié)是一個(gè)數(shù)據(jù)單位。
2、void *就是一個(gè)不能動(dòng)的“地址”,在進(jìn)行&、移動(dòng)指針之前必須轉(zhuǎn)型為類型指針。
3、指針在只知道內(nèi)存,但是不知道是什么類型的時(shí)候。
4、在C/C++中,在任意時(shí)刻都可以使用其它類型指針來代替void指針,或者用void指針來代替其他類型指針。
5、對(duì)指針變量的解引用,使用間接運(yùn)算符*達(dá)到目的。但是在使用空指針的情況下,需要轉(zhuǎn)換指針變量解引用。這是因?yàn)榭罩羔槢]有與之關(guān)聯(lián)的數(shù)據(jù)類型。編譯器無法知道void指針指向的數(shù)據(jù)類型。因此,要獲取由void指針指向的數(shù)據(jù),需要使用在void指針位置內(nèi)保存的正確類型的數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換。
也就是說,void*類型的指針可以接受任意類型的指針
但是不能夠進(jìn)行解引用操作,也不能進(jìn)行加減運(yùn)算
需要注意的是,void* 即使在接收某一具體類型的指針后,它的類型依然是void*,我們?nèi)匀粺o法對(duì)其進(jìn)行解引用操作,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換才可以。
由于空指針的特殊性,我們一般將其運(yùn)用在函數(shù)參數(shù)里,用以接收各種類型的參數(shù)。
例:
void* e1;
*(int*)e1;
下面附帶一個(gè)有空指針參與的qsort(快速排序)函數(shù)
注1:由于qsort是庫函數(shù),因此我在編寫時(shí)將函數(shù)名改為了 ‘my_qsort’
注2:此函數(shù)只是向大家展示空指針的應(yīng)用,其中仍有指針方面的知識(shí),我們會(huì)在后續(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++)
{ //兩個(gè)元素的比較
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)注
183文章
7644瀏覽量
145596 -
Int
+關(guān)注
關(guān)注
0文章
27瀏覽量
16461 -
符號(hào)
+關(guān)注
關(guān)注
0文章
56瀏覽量
4765
發(fā)布評(píng)論請(qǐng)先 登錄
C語言中void指針的基本認(rèn)識(shí)及典型應(yīng)用
C語言中的基本數(shù)據(jù)類型
C預(yù)處理與C語言基本數(shù)據(jù)類型
C程序的運(yùn)行環(huán)境和C語言的數(shù)據(jù)類型
C語言void及void指針深層探索
淺談void 型指針的高階用法
STM32編程:void指針高階用法舉例,設(shè)計(jì)一個(gè)通用掉電存儲(chǔ)子系統(tǒng)
一文揭秘C語言的void指針
什么是void指針
C語言的數(shù)據(jù)類型-2
如何理解C++中的void?
C語言數(shù)據(jù)類型有哪些
什么是C語言(void*)類型
評(píng)論